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;
}
}