spring的依赖注入

spring依赖注入是在spring IoC中处理Bean之间的依赖的方式。

@Autowired

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true;
}

        @Autowired是Spring最常用的注解之一,它会根据属性的类型(by type)找到对应的bean进行注入。

        @Autowired可以修饰属性,表示从Ioc中找到对应的Bean进行注入。这个bean是已经加载到Ioc中的。这样@Autowired才能找到对应的属性。

       @Autowired的加载规则:

  • 默认必须找到一个对应的Bean注解,如果不确定是否找到,可以配置其必填属性为false
  • @Autowired匹配时,首先根据类型找到对应的bean,如果对应的类型Bean不唯一,则再根据属性名称进行匹配。匹配成功则使用,失败则抛异常。
  • @Autowired修饰方法时会在对象建立的时候调用修饰的方法在Ioc容器中找到对应的Bean进行注入。

假设我现在有一个接口TestBean,以及两个实现类TestSerice, TestService2

public interface TestBean {
    String save();
    String delete();
}
@Component
public class TestService implements TestBean {
    @Override
    public String save() {
        return "service";
    }
    @Override
    public String delete() {
        return "service";
    }
}

@Component
public class TestService2 implements TestBean {
    @Override
    public String save() {
        return "service2";
    }
    @Override
    public String delete() {
        return "service2";
    }
}

当使用以下方式获取时,程序报错。

@Autowired
TestBean testBean;
Field testBean in com.zhong.zhongdemo.ZhongdemoApplication required a single bean, but 2 were found:
	- testService: defined in file [G:\idea-workspace\zhongdemo\target\classes\com\zhong\zhongdemo\demo1\TestService.class]
	- testService2: defined in file [G:\idea-workspace\zhongdemo\target\classes\com\zhong\zhongdemo\demo1\TestService2.class]

如果改为,以下就不会报错了。

@Autowired
TestBean testService;

@Autowired修饰方法,如:

@Service
public class TestService implements TestBean {
    QueryDto queryDto;

    @Autowired
    public void setQueryDto(QueryDto queryDto){
        this.queryDto = queryDto;
    }
}

这样在构建TestService对象的时候就会自动在Ioc中根据"setQueryDto"找到对应的bean进行注入。假设我们提供一个bean名称setQueryDto的配置。

@Configuration
public class ConfigBean {

    @Bean("setQueryDto")
    public QueryDto setQueryDto(){
        QueryDto queryDto = new QueryDto();
        queryDto.setName("111111111111111");
        return queryDto;
    }
}

然后启动项目。获取TestService对象,断点查看可得到:所以是可以找到并注入的

@Primary

@Primary是修改优先权的注解。当注释在被@Component的类上时,改类就会比其他的实现类优先使用。

@Quelifier

@Quelifier与@Autowired一起使用,通过类型和名称一起获取Bean。@Quelifier的value必须有一个值,这个是就是需要获取的bean的名称。通常会在带参数的构造方法中使用。例如:

@Component
public class Test(){
    privte  TestBean testService

    public Test(@Quelifier("testService") @Autowired TestBean testBean){
        this.testService = testBean;
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值