背景:@Autowired、@Resource均能实现bean注入,但是两者的注入方式是不一样的。
1、@Resource - J2EE提供
默认以名称方式注入。
有两个属性是比较重要的:
name: Spring 将 name 的属性值解析为 bean 的名称, 使用 byName 的自动注入策略;
type: Spring 将 type的属性值解析为 bean 的类型,使用 byType 的自动注入策略;
如果既不指定 name 属性又不指定 type 属性,Spring这时通过反射机制使用 byName 自动注入策略。
@Resource 的装配顺序:
如果同时指定了 name 属性和 type 属性,那么 Spring 将从容器中找唯一匹配的 bean 进行装配,找不到则抛出异常;
如果指定了 name 属性值,则从容器中查找名称匹配的 bean 进行装配,找不到则抛出异常;
如果指定了 type 属性值,则从容器中查找类型匹配的唯一的 bean 进行装配,找不到或者找到多个都会抛出异常;
如果都不指定,则会自动按照 byName 方式进行装配, 如果没有匹配,则回退一个原始类型进行匹配,如果匹配则自动装配;
2、@Autowired - Spring
默认以类型方式注入。默认情况下,它要求依赖对象必须存在,如果允许 null 值,可以设置它 required 为false。
若要以名称方式注入,则再加上@Qualifier(“name”) - (如果有多个类型一样的Bean候选者,则需要限定其中一个候选者,否则将抛出异常)。
demo code:
@Bean(name = "threadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
return new ThreadPoolExecutor(10, 100,
120L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000));
}
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
return new ThreadPoolTaskExecutor();
}
@Autowired
@Qualifier("threadPoolTaskExecutor")
private Executor executor;