可以从Bean定义、名称、注入、生命过程等方面分类
也可以从
基于配置
方式进行分类。
大体上可以分为以下图中几种类型的加载方式。
Bean定义方面
:声明Bean,为了以后的调用,大部分用来定义类对象和方法
基于Xml
:最简单的方式,直接在xml文件中配置id并在java里获取Id。
有三种获取方式,原理相同都是在xml里设置Bean的Id,也可以通过factory-method方式获取需要注意构造函数和set、get方法
UserService userService = (UserService) applicationContext.getBean(“userService”);UserService userService = (UserService) applicationContext.getBean(“userServiceFactory”);
UserService userService = (UserService) applicationContext.getBean(“getUserService”);
基于注解:
最常用的方式之一,用来注解类,有@Component,@Service等常用标签,不需要set、get等方法
在类上直接写@Component就会注入该类 如果有有参构造,一定要写上
无参构造
,否则报错,因为IOC是基于反射原理实现的。
@Component
public class Person {
}
然后调用该类,@Compoent默认该类小写
Person person2=(Person) applicationContext.getBean(“person”);
基于Java注解:
也算比较常用,常用来设置一些java类属性
@Bean可以注解方法,如果不写的话就
默认该方法的名称
(方法名按
规范
写),需要注意的是,如果是在
同一个扫描包下(即在一个 Beans
里)
,需要注意防止
Bean
的
名称
重复
比如:在dog类下bean注解Dog的 toString()方法
测试类里Cat cat=(Cat) applicationContext.getBean(“cat”);
System.out.println(“–“+cat);
结果:10–cat
执行的狗的toString方法,执行Bean注解的方法,这样会
自动实例化
狗对象,前提是这个类已经被注解定义
@Configuratio和@Component都行,
Bean名称方面:
和定义的区别主要是给Bean注入了name属性注入了值等等
基于Xml:
通过id或name指定
大概情况如图所示
基于注解:
直接在类上写上@Component(“值”)即可
基于Java注解:
使用@Bean(name=”值”)给方法注解
Bean注入方面:
主要指给属性赋值
基于Xml:
基于注解:
@Autowired 按类自动注入,注入的类需要已经被注解过。@Qualifier按名称手动注入,通过已经注解过的Bean值来注入。
基于Java注解:
在java内部编写注入逻辑