手动注入
- set方法注入
<bean name="userService" class="com.xxx.service.UserService">
<property name="orderService" ref="orderService"/>
</bean>
- 构造方法注入
<bean name="userService" class="com.xxx.service.UserService">
<constructor‐arg index="0" ref="orderService"/>
</bean>
自动注入
- 1. XML的autowire自动注入
1. byType
<bean id="userService" class="com.xxx.service.UserService" autowire="byType"/>
获取到set方法中的唯一参数的参数类型,并且根据该类型去容器中获取bean
如果找到多个,会报错。
2. byName
找到所有set方法所对应的XXX部分的名字
根据XXX部分的名字去获取bean
3. constructor
spring利用构造方法的参数信息从Spring容器中去找bean,找到bean之后作为参数传给构造方法,从而实例化得到一个bean对象,并完成属性赋值(属性赋值的代码得程序员来写)。
其实构造方法注入相当于byType+byName,普通的byType是根据set方法中的参数类型去找
bean,找到多个会报错,而constructor就是通过构造方法中的参数类型去找bean,如果找到多个会根据参数名确定。
4. default
<bean>标签中设置的autowire如果为default,那么则会用<beans>标签中设置的autowire。
5. no
关闭autowired
- 2. @Autowired注解的自动注入
byType和byName的结合。@Autowired注解可以写在:
1. 属性上:先根据属性类型去找Bean,找到多个再根据属性名确定一个
2. 构造方法上:先根据方法参数类型去找Bean,找到多个再根据参数名确定一个
3. set方法上:先根据方法参数类型去找Bean,如果找到多个再根据参数名确定一个
寻找注入点
代补充
注入点进行注入
方法入口:
AutowiredAnnotationBeanPostProcessor的#postProcessProperties(),遍历所找到的注入点进行注入。
- 字段注入
- set方法注入