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