在Spring
中,一个bean
对外部的依赖主要有以下几种情况 :
编号 | 依赖形式 | 简介 | 依赖注入过程的要点 |
---|---|---|---|
1 | 构造函数参数 | 构造函数参数即使不使用任何注解也会被作为bean 依赖处理 | AbstractAutowireCapableBeanFactory#autowireConstructor |
2 | 使用@Autowired 注解的成员函数的参数 | 用于注入其他bean ,一般常见的基于public set 方法的属性依赖 | AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement |
3 | 使用@Value 注解的成员属性 | 一般用于注入固定值或者来自外部配置的值 | AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement |
4 | 使用@Autowired 注解的成员属性 | 用于注入bean ,一般常见的属性依赖,该属性可以不使用public 修饰符 | AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement |
代码举例 :
@Controller
public class HomeController {
// 情况 1
ServletRequest constructorRequest;
//// 注意这是一个构造函数,其参数 request 上没有使用任何注解
public HomeController(ServletRequest request) {
constructorRequest = request;
}
// 情况2
//// 注意该属性上没有使用任何注解,该属性通过 setRequest 设置
ServletRequest methodRequest;
@Autowired
public void setRequest(ServletRequest request) {
this.methodRequest = request;
}
// 情况3
@Value("${city}")
String city;
// 情况4
@Autowired
ServletRequest fieldRequest;
// 其他代码省略
// ...
}
参考文章
Spring BeanPostProcessor : AutowiredAnnotationBeanPostProcessor
Spring 依赖解决过程分析
Spring bean 构造函数参数依赖注入分析