Spring框架中的依赖注入:注解方式详解

239 阅读2分钟

控制反转(IoC)简介

控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法。

简单来说控制依赖注入出现之前对象实例是由程序猿自己new的,如果对象之间的依赖关系复杂,相当费事费力,于是IOC应运而生,把对象交给spring来管理,由Spring IoC容器来帮我们new出对象实例,利用反射加工厂的方式。

使用方式

Spring IoC容器注册

注解注入在 XML 注入之前执行。因此,如果两者之间存在差异,‌那么最终应用的依赖注入将基于 XML 配置中的设置。‌

1.通过注解注册

@Component 最普通的组件,可以被注入到Spring IoC容器进行管理

@Repository 作用于持久层

@Service 作用于业务逻辑层

以上三个注解都可以用

 public interface Animal {
     void eat();
 }
 ​
 @Component
 public class Cat implements Animal{
 ​
     @Override
     public void eat(){
         System.out.println("猫吃");
     }
 }

2.配置类注册

以下会把Play注册到Spring IoC容器中

 @Configuration
 public class PlayConfig {
 ​
     @Bean
     public Play play(Dog dog, Cat cat, @Qualifier("dog")Animal animal) {
         animal.eat();
         return new Play(dog, cat);
     }
 ​
 }

注意:

配置类中对应的方法的参数,只要是容器中的,都会按照类型自动注入,如果存在相同类型的多个类,会报错,解决办法为:对应参数加Qualifier参数指定类型或者在某个实现类上加@Primary表示默认首选

如果参数列表是List接口类型,Spring会自动注入所有该接口的实现类;Map类型参数也会得到类似的处理

依赖注入

1.注入

@Autowired

@Resource

两种方式区别

依赖查找顺序:

  • @Resource: 默认的注入顺序是按照Bean的名称进行匹配,如果找不到,则会按照类型进行匹配。如果仍然找不到,将不会抛出异常,而是返回null
  • @Autowired: Spring容器在解析@Autowired注解时,首先会按照类型进行匹配,如果存在多个相同类型的Bean,则会进一步根据名称进行匹配。如果没有用@Qualifier明确指定名称,Spring将抛出异常。

来源: @Autowire是依赖于Spring的,而@Resourse是基于java的

以下两种引用依赖的方式是等同的,一般比较推荐使用@Resource

 @Resource(name = "cat")
 private Animal cat;
 ​
 @Autowired
 @Qualifier(value = "cat")
 private Animal cat1;
 ​
 void eat(){
     cat.eat();
     cat1.eat();
 }

2.使用注意事项

如果一个类依赖于被Spring IoC容器管理的Bean,那么这个类就不能自己通过new来创建,否则会找不到被注入的类

 public class Home {
 ​
     @Resource
     private Dog dog;
 ​
     public void play(){
         dog.play();
     }
 }
 ​
 @Test
 void play() {
     Home home = new Home();
     home.play();
 }

直接调用的话Home.dog为空