4.5---Spring框架之Spring的自动装配(复习版本)
使用autowire来配置自动装载模式,对象无需自己查找或创建与其关联的其他对象,由容器负责把需要相互协作的对象引用赋予各个对象。
1.在Spring框架xml配置中共有5种自动装配:
1.no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。
2.byName:通过bean的名称进行自动装配,如果一个bean的 property (性质)与另一bean 的name 相同,就进行自动装配。
3.byType:通过参数的数据类型进行自动装配。
4.constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
5.autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。
2.基于注解的自动装配方式:
使用@Autowired、@Resource注解来自动装配指定的bean;
在使用@Autowired注解之前需要在Spring配置文件进行配置。
在启动springIoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。
在使用@Autowired时,首先在容器中查询对应类型的bean:
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
如果查询的结果不止一个,那么@Autowired会根据名称来查找;
如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。
@Autowired的注入规则:
1、@Autowired默认情况下按照类型在spring容器中查找对应的组件 :context.getBean(XXX.class);
@Autowired
private UserService userService;
此时,如果容器中只有一个userservice的bean,那么就会根据UserService.class进行注入
2.如果容器中存在多个userservice的bean对象,那么就会根据属性的名称作为组件的id在容器中查找context.getBean(“xxx”);
@Autowired
private UserService userService2;
此时就会根据userservice2进行查找bean
@Autowired可用于:构造函数、成员变量、Setter方法
注:@Autowired和@Resource之间的区别:
(1) @Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。
(2) @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。