IOC

依赖注入

注解

@Component


介绍

标记一个组件,可以将此类自动化装配到bean容器

作用对象

TYPE

衍生

衍生的几个注解的作用与@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中没有对象时将跳过注入,不会报错。即“有则注入,没有则跳过”。

    几种注入方法

    基于构造函数的依赖注入

    1. @Component
    2. public class ConstructorBasedInjection {
    3. private final InjectedBean injectedBean;
    4. @Autowired
    5. public ConstructorBasedInjection(InjectedBean injectedBean) {
    6. this.injectedBean = injectedBean;
    7. }
    8. }

    spring官方文档中表示,此时@Autowired注解可以省略,但是当存在多个构造函数时,必须使用@Autowired注解,来指明需要使用哪个构造函数。基于构造函数注入的主要优点是可以将需要注入的字段声明为final, 使得它们会在类实例化期间被初始化,这对于所需的依赖项很方便。
    对于必需的依赖,推荐使用基于构造函数的注入,并将它们设置为不可变,以及防止它们为null;
    对于可选的依赖,推荐使用基于Setter的注入。

    基于Setter的依赖注入

    1. @Component
    2. public class SetterBasedInjection {
    3. private InjectedBean injectedBean;
    4. @Autowired
    5. public void setInjectedBean(InjectedBean injectedBean) {
    6. this.injectedBean = injectedBean;
    7. }
    8. }

    基于属性的依赖注入

    1. @Component
    2. public class FieldBasedInjection {
    3. @Autowired
    4. private InjectedBean injectedBean;
    5. }

    这种方法虽然最简单整洁,但是官方目前已经不建议这样使用,而且这种方法在IDEA中也将有相应的提示: Field injection is not recommended 。不推荐的理由有:

  1. 不能有效指明依赖。使用构造器的方式将明确指明类需要哪些依赖,使用Setter的方式表示此属性为可选依赖,而使用基于属性的方式很容易让程序员忽略需要的依赖,当bean容器中不包含此依赖时,程序将无法正常运行。
  2. 违反了单一职责设计原则。使用这种方法会不自觉地给类增加过多的依赖,将违反单一职责原则。
  3. 不能作用于final。与构造函数不同,属性注入不能作用于final字段。