IOC
依赖注入
注解
@Component
介绍
作用对象
衍生
衍生的几个注解的作用与@Component一致,用于标记不同分层的类
@Repository
:DAO层@Service
:Service层@Controller
:Controller层
@Value
介绍
作用对象
TYPE
METHOD
PARAMETER
ANNOTATION_TYPE
参数
- String value:给属性注入的值
@Autowired
介绍
作用对象
CONSTRUCTOR
METHOD
PARAMETER
FIELD
ANNOTATION_TYPE
参数
boolean required() default true
:如果Bean中没有此对象,注入就会失败,将报错。如果设置为false
,Bean中没有对象时将跳过注入,不会报错。即“有则注入,没有则跳过”。几种注入方法
基于构造函数的依赖注入
@Component
public class ConstructorBasedInjection {
private final InjectedBean injectedBean;
@Autowired
public ConstructorBasedInjection(InjectedBean injectedBean) {
this.injectedBean = injectedBean;
}
}
spring官方文档中表示,此时@Autowired注解可以省略,但是当存在多个构造函数时,必须使用@Autowired注解,来指明需要使用哪个构造函数。基于构造函数注入的主要优点是可以将需要注入的字段声明为final, 使得它们会在类实例化期间被初始化,这对于所需的依赖项很方便。
对于必需的依赖,推荐使用基于构造函数的注入,并将它们设置为不可变,以及防止它们为null;
对于可选的依赖,推荐使用基于Setter的注入。基于Setter的依赖注入
@Component
public class SetterBasedInjection {
private InjectedBean injectedBean;
@Autowired
public void setInjectedBean(InjectedBean injectedBean) {
this.injectedBean = injectedBean;
}
}
基于属性的依赖注入
@Component
public class FieldBasedInjection {
@Autowired
private InjectedBean injectedBean;
}
这种方法虽然最简单整洁,但是官方目前已经不建议这样使用,而且这种方法在IDEA中也将有相应的提示:
Field injection is not recommended
。不推荐的理由有:
- 不能有效指明依赖。使用构造器的方式将明确指明类需要哪些依赖,使用Setter的方式表示此属性为可选依赖,而使用基于属性的方式很容易让程序员忽略需要的依赖,当bean容器中不包含此依赖时,程序将无法正常运行。
- 违反了单一职责设计原则。使用这种方法会不自觉地给类增加过多的依赖,将违反单一职责原则。
- 不能作用于final。与构造函数不同,属性注入不能作用于final字段。