【spring注解驱动开发】- 自动装配 - @Resource&@Inject

本博客demo源码地址
https://github.com/suchahaerkang/spring-annotation.git

上篇博客我们学习了通过spring提供的注解@Autowired进行自动装配。本篇博客将介绍java提供的两个注解来进行自动装配
JSR250 提供的@Resource和JSR330提供@Inject,JSR250和JSR330都是java规范

1 @Resource

这里我就在上一遍博客的代码基础上进行修改,上一篇文章中,我们是注册了BookService和BookDao组件,并且BookService依赖BookDao组件。我们特意注册了注册了两个类型都是BookDao组件的实例,在容器中id分别是bookDao和bookDao2,并且注册bookDao2的时候加上了@Primary注解,是想让其优先自动装配。不清楚的请看上篇文章,在这里我就不把所有的代码贴出来了。现在我们将BookService注解中自动注入注解@Autowired注释掉,换成@Resource

/**
 * @description:
 * @author: sukang
 * @date: 2020-03-04 15:09
 */
@ToString
@Service
public class BookService {

    @Qualifier("bookDao2")
    //@Autowired(required = false)
    @Resource
    private BookDao bookDao;
}

运行结果
在这里插入图片描述
从结果看出,虽然我们通过@Primary设置了bookDao2优先注入的权力和@Qualifier指定bookDao2优先注入,但是最后注入的是bookDao,所以我们得出结论是java提供的@Resource注解默认是按照注入的属性名去容器中找相应的实例的, 不能和spring提供的@Qualifier和@Primary配合使用,并且不能像@Autowired注解一样使用required = false

2 @Inject

使用这个注解,需要引入一个java的依赖包
在这里插入图片描述
将依赖包引到项目之后,把@Resource注解换成@Inject进行自动装配

/**
 * @description:
 * @author: sukang
 * @date: 2020-03-04 15:09
 */
@ToString
@Service
public class BookService {

    @Qualifier("bookDao2")
    //@Autowired(required = false)
    //@Resource
    @Inject
    private BookDao bookDao;
}

运行结果
在这里插入图片描述
从结果我们可以看出@Primary起作用了,说明@Inject和@Autowired注解的功能差不多,只是@Inject没有@Autowired的required = false功能

3 总结

@Autowired,@Inject和@Resource都可以进行自动装配,只是前面一个是spring提供的,后面两个是java提供。如果项目中用到了spring这个框架,最好是用@Autowired,因为@Autowired相对而言功能多一点。

4 附加@Autowired相关的知识点

@Autowired不仅仅可以标注在属性上,而且还能标注在构造函数,方法和方法参数上面
在这里插入图片描述
1)如果标注在方法上面,那么组件在创建,初始化时候回调用这个方法,并且方法所带的参数都可以直接去容器中去找,不需要要标注任何注解
2)如果标注在有参构造函数上面,那么组件在创建的时候是通过有参构造函数来创建的,并且有参构造函数需要的参数都可以直接去容器中获取。另外如果一个组件中只有一个有参构造函数,没有无参构造函数,那么可以省略标注@Autowired这个注解,实现的效果是一样的
PS:如果配置类中通过@Bean标注在有参函数进行注册组件的话,这个有参函数想要的参数组件也可以省略@Autowired注解,直接去容器中获取

发布了78 篇原创文章 · 获赞 32 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/suchahaerkang/article/details/104716605