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

控制反转(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为空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值