Spring 单例和静态方法
前景
以前理解:
单例就是在上下文中实例化一次。
多例就是在上下文中实例化多次。
静态方法就是增加修饰符 static。
后来接触到多线程开发后,发现单例并不是线程安全的。而 springmvc 开发中,controller 默认是单例,又天然是支持多线程的。
数据库交互又是通过连接池完成的,明显不是单例,如果是单例的话岂不是变成单线程了。
怀着这样的疑惑网络上搜索了下,总是模棱俩可,沉下下来,阅读源码和实验后豁然开朗。
正文
单例
@controller @Service @Repository 是否默认是单例,如何实现的
上述 3 个最终注解都是 @Component。
创新 bean 时的确是单例的
@Repository 中和数据库交互部分 JdbcTemplate 是通过 java 中的 ThreadLocal 来实现线程安全的。
线程安全
如果是静态变量,静态方法无法是否开启多例都是只有一份是非线程安全的
如果非静态变量,开发多例情况下是线程安全的。
版权声明: 本文为 InfoQ 作者【hasWhere】的原创文章。
原文链接:【http://xie.infoq.cn/article/7b454b080573dd10ab416b382】。未经作者许可,禁止转载。
评论