Springcloud学习笔记51--@Configuration+@Bean实现自动化装配,解决第三方jar中类bean交给spring管理;Spring 中的bean 不是线程安全的;
1.@Configuration+@Bean实现自动化装配
1.1.编写配置类
此时,第三方类为DataSource;
/** * @Author lucky * @Date 2022/4/1 9:18 * 配置数据库连接池,注入DataSource */ @Configuration public class DruidConfig { @Autowired private DataSourceProperties dataSourceProperties; @Bean public DataSource druidDataSource(){ DruidDataSource druidDataSource=new DruidDataSource(); druidDataSource.setDriverClassName(dataSourceProperties.getDriverClassName()); druidDataSource.setUrl(dataSourceProperties.getUrl()); druidDataSource.setUsername(dataSourceProperties.getUsername()); druidDataSource.setPassword(dataSourceProperties.getPassword()); druidDataSource.setInitialSize(dataSourceProperties.getInitialSize()); druidDataSource.setMinIdle(dataSourceProperties.getMinIdle()); druidDataSource.setMaxActive(dataSourceProperties.getMaxActive()); druidDataSource.setMaxWait(dataSourceProperties.getMaxWait()); druidDataSource.setTimeBetweenEvictionRunsMillis(dataSourceProperties.getTimeBetweenEvictionRunsMillis()); druidDataSource.setMinEvictableIdleTimeMillis(dataSourceProperties.getMinEvictableIdleTimeMillis()); druidDataSource.setValidationQuery(dataSourceProperties.getValidationQuery()); druidDataSource.setTestWhileIdle(dataSourceProperties.isTestWhileIdle()); druidDataSource.setTestOnBorrow(dataSourceProperties.isTestOnBorrow()); druidDataSource.setTestOnReturn(dataSourceProperties.isTestOnReturn()); try { druidDataSource.init(); } catch (SQLException e) { e.printStackTrace(); } return druidDataSource; } }
1.2.测试案例
@RestController @RequestMapping("/hello") @Api public class HelloController { @Autowired DruidConfig druidConfig; @PostMapping("/login") @ApiOperation(value = "你好") public void login(@RequestParam @ApiParam(name="name",value="对话人",required=true) String name){ DataSource dataSource = druidConfig.druidDataSource(); DataSource dataSource2 = druidConfig.druidDataSource(); System.out.println("hello!"+name); } }
通过自动装配,生成的DataSource被spring托管的,单例模式;
2.Spring 中的bean 不是线程安全的
Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。
Spring 的 bean 作用域(scope)类型
1、singleton:单例,默认作用域。
2、prototype:原型,每次创建一个新对象。
3、request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。
4、session:会话,同一个会话共享一个实例,不同会话使用不用的实例。
5、global-session:全局会话,所有会话共享一个实例。
线程安全这个问题,要从单例与原型Bean分别进行说明。
(1)原型Bean
对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。
(2)单例Bean
对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。
如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。
参考文献:https://www.cnblogs.com/myseries/p/11729800.html
分类:
springcloud
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)