用过spring的一定知道@Autowired这个注解,那我抛个问题:@Autowired注入的资源如何保证线程安全呢?
熟悉@Autowired注解实现的都知道 @Autowired默认是单例的,主要用于降低资源开销,提高性能。
假设现在有这么一个bean
我在aservice中注入这个bean并且修改这个index值
这个时候bean的index已经等于2了,我在用bservice注入这个bean打印bean的index值
结果如何呢?
贴上调用代码
执行完之后
第一个2是aservice将index+1后返回的,第二个2是bservice调用的bean类。可见单例模式下,如果注入的对象属性有public修饰符且没有final修饰的时候是很危险的
当有final修饰之后去更改这个值就会编译不通过了。
像这样:
已经编译不过了
上述问题有2个方法解决:
1、注入的对象不要使用public,尽量用私有属性,非要用publlic 建议加上final修饰
2、注入的对象加上 @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE),将其范围声明成多例的,这样开销比较大,每次注入都会创建一个新的实例来注入。
像这样
多例范围声明
示例源代码:https://github.com/liuchengts/spring-Autowired-demo
欢迎关注我的个人公众号
评论区