上文系统的介绍了spring自动装配@Autowired注解的使用,没有查看的可以点击查看,@Autowired注解大家使用过,那今天的两个自动注入可能就不是每个同学都有使用过,不信你看
今天将从以下几方面来学习一下@Resource和@Inject注解:
-
@Resource注解的使用演示
-
@Inject注解的使用演示
-
@Resource和@Inject注解与@Autowired注解的区别
1,@Resource注解的使用演示
把上文中的例子注入修改如下:
// @Qualifier(value="userDao")
// @Autowired(required=false)
@Resource
private UserDao userDao2;
运行测试类结果如下:
实例bean为 === UserService [userDao=UserDao [version=2]]
让我们@Resource注解中加上一个name参数如下:
@Resource(name="userDao")
继续运行测试结果如下:
实例bean为 === UserService [userDao=UserDao [version=0]]
从运行结果我们可以发现:
-
@Resource注解默认根据参数名字寻找bean注入
-
@Resource也可以通过name参数指定需要注入的bean
-
@Resource注解不支持spring的@Primary注解优先注入
2,@Inject注解的使用演示
在演示@Inject注解前需要先在pom文件中增加如下依赖:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
UserService类UserDao注入修改为如下:
@Inject
private UserDao userDao;
对应的主配置文件如下:
@Primary
@Bean(value = "userDao2")
public UserDao getUserDao(){
UserDao userDao = new UserDao();
userDao.setVersion(2);
return userDao;
}
运行测试类结果如下:
实例bean为 === UserService [userDao=UserDao [version=2]]
UserService类注入代码修改如下:
@Named("userDao")
private UserDao userDao;
运行测试类结果如下:
实例bean为 === UserService [userDao=UserDao [version=0]]
从以上运行结果我们可以得出:
-
@Inject注解默认是根据参数名去寻找bean注入
-
@Inject注解支持spring的@Primary注解优先注入
-
@Inject注解可以增加@Named注解指定注入的bean
3,@Resource和@Inject注解与@Autowired注解的区别
不同点
-
@Autowired是spring专有注解,@Resource是java中JSR250中的规范,@Inject是java中JSR330中的规范
-
@Autowired支持参数required=false,@Resource,@Inject都不支持
-
@Autowired,和@Inject支持@Primary注解优先注入,@Resource不支持
-
@Autowired通过@Qualifier指定注入特定bean,@Resource可以通过参数name指定注入bean,@Inject需要@Named注解指定注入bean
相同点
三种注解都可以实现bean的注入
以上是今天文章的所有内容,欢迎大家吐槽
推荐阅读
深入理解spring生命周期与BeanPostProcessor的实现原理
更多优质文章请关注以下公众号查阅: