侧边栏壁纸
博主头像
术业有道之编程博主等级

亦是三月纷飞雨,亦是人间惊鸿客。亦是秋霜去叶多,亦是风华正当时。

  • 累计撰写 99 篇文章
  • 累计创建 50 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

spring@Autowired真的如你所想吗?

Administrator
2020-09-01 / 0 评论 / 0 点赞 / 94 阅读 / 5705 字

用过spring的一定知道@Autowired这个注解,那我抛个问题:@Autowired注入的资源如何保证线程安全呢?

熟悉@Autowired注解实现的都知道 @Autowired默认是单例的,主要用于降低资源开销,提高性能。

假设现在有这么一个bean
spring@Autowired-1

我在aservice中注入这个bean并且修改这个index值
spring@Autowired-2

这个时候bean的index已经等于2了,我在用bservice注入这个bean打印bean的index值
spring@Autowired-3

结果如何呢?

贴上调用代码
spring@Autowired-4

执行完之后
spring@Autowired-5

第一个2是aservice将index+1后返回的,第二个2是bservice调用的bean类。可见单例模式下,如果注入的对象属性有public修饰符且没有final修饰的时候是很危险的

当有final修饰之后去更改这个值就会编译不通过了。

像这样:
spring@Autowired-6

spring@Autowired-7

已经编译不过了
上述问题有2个方法解决:

1、注入的对象不要使用public,尽量用私有属性,非要用publlic 建议加上final修饰

2、注入的对象加上 @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE),将其范围声明成多例的,这样开销比较大,每次注入都会创建一个新的实例来注入。

像这样
spring@Autowired-8

多例范围声明
示例源代码:https://github.com/liuchengts/spring-Autowired-demo

欢迎关注我的个人公众号
个人公众号

0

评论区