我们好,我是Spring作者Juergen Hoeller中的Hoeller。

今日来跟我们聊聊简单聊聊@Autowired,Autowired翻译过来为主动装配,也便是主动给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.
	 * <p>Defaults to {@code true}.
	 */
	boolean required() default true;
}

以上是@Autowired的定义,要点看 @Target,我们发现@Autowired能够写在:

  1. ElementType.CONSTRUCTOR:表明能够写在结构办法上

  2. ElementType.METHOD:表明能够写在一般办法上

  3. ElementType.PARAMETER:表明能够写在办法参数前

  4. ElementType.FIELD:表明能够写在特点上

  5. ElementType.ANNOTATION_TYPE:表明能够写在其他注解上

写在结构办法上

关于@Autowired写在结构办法上的状况,跟Spring挑选结构办法的逻辑有关,一个类中是不是有多个结构办法,是不是加了@Autowired注解,是不是有默许结构办法,跟结构办法参数类型和个数都有联系,后面独自来介绍。

写在一般办法上

关于@Autowired写在一般办法上的状况,我们一般写的setter办法其实便是一个一般的setter办法,那非setter办法上加@Autowired会有效果吗?

比方:

@Component
public class UserService {
	@Autowired
	public void test(OrderService orderService) {
		System.out.println(orderService);
	}
}

这个test办法会被Spring主动调用到,并且能打印出OrderService对应的Bean目标。

写在办法参数前

把@Autowired写在参数前没有多大意义,只在spring-test中有去处理这种状况,源码注释原文:

Although @Autowired can technically be declared on individual method or constructor parameters since Spring Framework 5.0, most parts of the framework ignore such declarations. The only part of the core Spring Framework that actively supports autowired parameters is the JUnit Jupiter support in the spring-test module

写在特点上

这种状况不用多说了,值得注意的是,默许状况下,由于@Autowired中的required特点为true,表明强制依靠,假如愈加某个特点找不到所依靠的Bean是不会赋null值的,而是会报错,假如把required特点设置为false,则会赋null值。

写在其他注解上

比方我们能够自定义要给注解:

@Autowired
@Retention(RetentionPolicy.RUNTIME)
public @interface HoellerAutowired {
}

@HoellerAutowired和@Autowired是等价的,能用@Autowired的地方都能够用@HoellerAutowired替代。

以上,随便写写,谢谢我们的观看。