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字段。
 
                         
                                

