(原创文章,转载请标明出处:https://blog.csdn.net/likeYou1207/article/details/107140161)
本文主要介绍Spring中自动注入@Autowired的几种常见用法,有作用于属性、构造方法、普通方法、数组、集合、Map
运行截图代码全部使用以下代码,调用context.getBean(ConfigA.class)截图
// 人类接口
public interface Person {
String effect();
}
// 男生类
@Component("nanhai") // 注意此处注解是有值得,在第五点会有特殊效果
public class Man implements Person{
private Integer age;
private String name;
@Override
public String effect() {
return "可以为女生开瓶盖!";
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 女生类
@Component
public class Girls implements Person{
private Integer age;
private String name;
@Override
public String effect() {
return "可以找男生开瓶盖!";
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 应用类,使用@Autowried的地方
@Controller
public class ConfigA {
}
// 启动类
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.jiang.demo.ioc.**");
ConfigA bean = context.getBean(ConfigA.class);
}
这种方式属于最常见方式,相信使用过spring的都知道
@Controller
public class ConfigA {
@Autowired
private Man man;
@Autowired
private Girls girls;
}
运行截图:
从Spring Framework 4.3开始,@Autowired
如果目标Bean仅定义一个的构造函数,则不再需要在此构造函数上添加注释,低于版本都需要在构造方法上添加@Autowired
注释。如果有多个构造函数可用,并且没有主/默认构造函数,则必须至少注释一个构造函数,@Autowired
以指示容器使用哪个构造函数
@Controller
public class ConfigA {
private Man man;
private Girls girls;
// 此处使用的spring版本是5.2.x
public ConfigA(Man man, Girls girls) {
this.man = man;
this.girls = girls;
}
}
运行截图:
常见的有作用于传统的setter方法之上,但同样可以作用于普通方法
@Controller
public class ConfigA {
private Man man;
private Girls girls;
@Autowired
public void setMan(Man man) {
this.man = man;
}
// 此处为任意方法名称
@Autowired
public void casual(Girls girls) {
this.girls = girls;
}
}
运行截图:
此方式可以作用于结合和数组之上,使用了一个接口Person
@Controller
public class ConfigA {
@Autowired
private Person[] people;
@Autowired
private Set<Person> personSet;
@Autowired
private List<Person> personList;
}
作用于Map方式Key默认是实现类名称的小驼峰,但Key可以自定义,例如@Component("nanhai")
,可以看男生类得代码,类注解有自定义名称nanhai
,常见应用场景如策略模式,比如说:有一个需求,需要根据特定的标识执行特定的代码,例如标识为nanhai的作用,可以通过personMap.get("nanhai").effect()
@Controller
public class ConfigA {
@Autowired
private Map<String, Person> personMap;
}
运行截图:
默认值为true,表示注入时Bean是否必须存在,否则报错;在Spring 5.1之前可以使用@Required
标识,但在5.1之后被弃用了,可以采用@Autowired(required = false)
方式使用,表示如果有就注入,没有就跳过。
应用场景:比如在一个公共模块中使用了@Autowired
属性,此模块被其它项目所依赖,在其它项目中也许并没有需要注入的Bean,也不需要此Bean,就可以使用Autowired(required = false)
来注入,否则在其它项目中就会启动报错,找不到Bean。
@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.
* Defaults to {@code true}.
*/
boolean required() default true;
}