结论先行
1)、 Spring还支持使用@Resource(JSR250)和@Inject(JSR330)[java规范的注解]
@Resource:
可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的;
没有能支持@Primary功能,没有支持@Autowired(reqiured=false);
@Inject:
需要导入javax.inject的包,和Autowired的功能一样。支持@Primary功能,但是没有required=false的功能;
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
2)、@Autowired:Spring定义的; @Resource、@Inject都是java规范
3)、注解自动注入的原理都是 AutowiredAnnotationBeanPostProcessor这个BeanPostProcessor解析完成的;
@Resource
bean定义
package com.ouyangxizhu.service;
import com.ouyangxizhu.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class BookService {
// @Qualifier("bookDao")
// @Autowired(required = false)
@Resource
private BookDao bookDao;
@Override
public String toString() {
return "BookService{" +
"bookDao=" + bookDao +
'}';
}
}
package com.ouyangxizhu.dao;
import org.springframework.stereotype.Repository;
//名字默认是类名首字母小写
@Repository
public class BookDao {
private int label = 1;
public int getLabel() {
return label;
}
public void setLabel(int label) {
this.label = label;
}
@Override
public String toString() {
return "BookDao{" +
"label=" + label +
'}';
}
}
配置类
package com.ouyangxizhu.config;
import com.ouyangxizhu.dao.BookDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Primary;
//@ComponentScan({"com.ouyangxizhu.controller","com.ouyangxizhu.service"})
@ComponentScan({"com.ouyangxizhu.controller","com.ouyangxizhu.service","com.ouyangxizhu.dao"})
public class MainConfigResourceInject {
//这里用bean属性定义id为bookDao2和将方法改成bookDao2效果一样
@Primary
@Bean("bookDao2")
public BookDao bookDao(){
BookDao bookDao = new BookDao();
bookDao.setLabel(2);
return bookDao;
}
}
启动类
package com.ouyangxizhu;
import com.ouyangxizhu.config.MainConfigAutowiredQualifierPrimary;
import com.ouyangxizhu.config.MainConfigResourceInject;
import com.ouyangxizhu.service.BookService;
import com.ouyangxizhu.utils.PrintBeanDefinitionNamesUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainTestResourceInject {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigResourceInject.class);
System.out.println("================");
BookService bookService = (BookService) context.getBean(BookService.class);
System.out.println(bookService);
PrintBeanDefinitionNamesUtils.printBeanNames(context);
}
}
结果
八月 05, 2020 10:50:00 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@31cefde0: startup date [Wed Aug 05 22:50:00 CST 2020]; root of context hierarchy
八月 05, 2020 10:50:00 下午 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init>
信息: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
================
BookService{bookDao=BookDao{label=1}}
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfigResourceInject
bookController
bookService
bookDao
bookDao2
结果说明
可以自动注入,但是不支持@Primary(如果支持BookDao的label应该是2)
@Inject
bean定义
package com.ouyangxizhu.service;
import com.ouyangxizhu.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.inject.Inject;
@Service
public class BookService {
// @Qualifier("bookDao")
// @Autowired(required = false)
// @Resource
@Inject
private BookDao bookDao;
@Override
public String toString() {
return "BookService{" +
"bookDao=" + bookDao +
'}';
}
}
结果
八月 05, 2020 10:53:34 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@31cefde0: startup date [Wed Aug 05 22:53:34 CST 2020]; root of context hierarchy
八月 05, 2020 10:53:34 下午 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init>
信息: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
================
BookService{bookDao=BookDao{label=2}}
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfigResourceInject
bookController
bookService
bookDao
bookDao2
结果
可以自动注入,并支持@Primary注解