作用
实现依赖注入
查找方式:@Autowired是先到容器查找类型,如果该类型只有一个那么就直接注入,有多个时再根据名字找
使用范围:构造器、方法、参数、字段、注解
参数:required
-> 标注的对象是否必须注入,可能这个对象在容器中不存在,如果为true的时候,找不到匹配的候选者就会报错,为false的时候,找不到也没关系,不会报错
定义
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
/*** Declares whether the annotated dependency is required.
* <p>Defaults to {@code true}.
*/
boolean required() default true;
}
参数:
CONSTRUCTOR:构造
METHOD:方法
PARAMETER:参数
FIELD:字段
ANNOTATION_TYPE: 注解
使用
1、用于构造方法
将@Autowired注解应用于构造函数,通过构造器注入依赖对象
public class Service {
private Service1 service1;
public Service(){
System.out.println(this.getClass() + "无参构造器");
}
@Autowired
public Service(Service1 service1){
System.out.println(this.getClass() +"有参构造器");
this.service1 = service1;
}
}
2、用于普通方法
将@Autowired标注在方法,spring从容器中查找方法参数相关的bean,然后注入依赖的对象,如果该方法有多个参数,默认多个参数都可以自动注入依赖
@Component
public class Service {
private Service1 service1;
private Service2 service2;
@Autowired
public void injectService1(Service1 service1){
this.service1 = service1;
}
@Autowired
public void injectService1(Service1 service1, Service2 service2){
this.service1 = service1;
this.service2 = service2;
}
}
3、用于setter方法
可能通过构造器,和通过普通的一个方法注入,这两种方式不是很常见,可以将@Autowired标注在set方法上面来注入指定的对象,如下所示
@Component
public class Service {
private Service1 service1;
@Autowired
public void setService1(Service1 service1){
this.service1 = service1;
}
}
4、用于方法参数上
@Autowired直接标注于方法的具体参数上,在多个参数的时候,方法上面的@Autowired默认对方法中所有的参数起效,如果我们想对其中某个参数进行特定的配置,则有以下两种方法实现:
1、可以在需依赖注入的参数前面加上@Autowired,就能实现自动依赖注入。
@Component
public class Service {
private Service1 service1;
private String name;
public void injectService(@Autowired Service1 service1, String name){
this.service1 = service1;
this.name = name;
}
}
此时方法的第一个参数则受到@Autowired约束,而第二个参数则不受约束
2、在不需要强制注入的参数前面加@Autowired,并设置required为false,这样则表示这个bean不是强制注入,能找到相应的bean就注入,找不到的话就注入一个null对象,如下 :
@Component
public class Service {
private Service1 service1;
private String name;
@Autowired
public void injectService(Service1 service1, @Autowired(required = false) String name){
this.service1 = service1;
this.name = name;
}
}
此时方法的第一参数被上面的@Autowired约束,第二个参数受@Autowired(required=false)
约束
5、用于字段上
@Autowired直接标注于具体的字段,则会自动进行依赖注入,Spring会去容器中按照类型查找相关类型的bean,然后将设置到相应的属性。
@Component
public class Service {
@Autowired
private Service1 service1;
}
6、用于Collection、Map中
1、注入到Collection中,被注入的类型为Collection类型或者Collection子接口类型,注意必须是接口类型
Collection<IService>
List<IService>
Set<IService>
2、注入到Map中,被注入的类型为Map类型或者Map子接口类型,注意必须是接口类型
Map<String,IService>
示例如下:
下面分别先定义一个接口,两个接口的实现类
public interface IService {
}
@Component
public class Service1 implements IService {
}
@Component
public class Service2 implements IService {
}
@Component
public class Service {
@Autowired
private List<IService> services; //@1
@Autowired
private Map<String, IService> serviceMap; //@2
}
@1: 注入IService类型的所有bean
@2: 注入一个map
原创文章,作者:jiafegn,如若转载,请注明出处:https://www.techlearn.cn/archives/254