★@ConfigurationProperties和@EnableConfigurationProperties配合使用

@ConfigurationProperties注解主要用来把properties配置文件转化为bean来使用的,而@EnableConfigurationProperties注解的作用是@ConfigurationProperties注解生效。如果只配置@ConfigurationProperties注解,在IOC容器中是获取不到properties配置文件转化的bean的。使用如下:

step1、spring boot启动时默认是加载application.properties配置文件的,假设该配置文件中内容为:
  local.host=127.0.0.1

  local.port=8080

step2、创建一个类ComponentProperties,把配置文件转化为bean来使用。@ConfigurationProperties注解可以把properties文件转化为bean,然后使用@Component注解把该bean注入到IOC容器中。

  1. import org.springframework.boot.context.properties.ConfigurationProperties;
  2. import org.springframework.stereotype.Component;
  3.  
  4. @Component
  5. /*prefix定义配置文件中属性*/
  6. @ConfigurationProperties(prefix="local")
  7. public class ComponentProperties {
  8.  
  9. /*host和port属性必须保持与application.properties中的属性一致*/
  10. private String host;
  11. private String port;
  12.  
  13. public void setHost(String host) {
  14. this.host = host;
  15. }
  16. public void setPort(String port) {
  17. this.port = port;
  18. }
  19.  
  20. @Override
  21. public String toString() {
  22. return "ComponentProperties [host=" + host + ", port=" + port + "]";
  23. }
  24.  
  25. }

step3、用@EnableConfigurationProperties注解使@ConfigurationProperties生效,并从IOC容器中获取bean。

  1. import org.springframework.boot.SpringApplication;
  2. import
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  5. import org.springframework.context.ConfigurableApplicationContext;
  6. import org.springframework.context.annotation.ComponentScan;
  7.  
  8. //@SpringBootApplication
  9. @ComponentScan
  10. /* @EnableConfigurationProperties注解是用来开启对@ConfigurationProperties注解配置Bean的支持。
  11. 也就是@EnableConfigurationProperties注解告诉Spring Boot 使能支持@ConfigurationProperties*/
  12. @EnableConfigurationProperties
  13. public class Springboot3Application {
  14.  
  15. public static void main(String[] args) throws Exception {
  16.  
  17. ConfigurableApplicationContext context = SpringApplication.run(Springboot3Application.class, args);
  18. /*@ConfigurationProperties注解和@EnableConfigurationProperties配合使用*/
  19. System.out.println(context.getBean(ComponentProperties.class));
  20. context.close();
  21. }
  22. }

启动类如上,@ComponentScan注解默认扫描启动类所在的包,该包下的类如果注入到了IOC容器中,那么在该启动类就能获取注入的bean。然后用@EnableConfigurationProperties注解使@ConfigurationProperties注解生效。因此在该启动类中就可以获取刚才application.properties配置文件转化的bean了。另外,只使用@SpringBootApplication一个注解也是可以的,因为@SpringBootApplication注解中已经包含了@ComponentScan和@EnableAutoConfiguration注解,@EnableAutoConfiguration注解最终使ConfigurationPropertiesAutoConfiguration类上的@EnableAutoConfiguration生效。

输出结果如下:ComponentProperties [host=127.0.0.1, port=8080]
原文:https://blog.csdn.net/u010502101/article/details/78758330

  EnableAsync注解的意思是可以异步执行,就是开启多线程的意思。可以标注在方法、类上。

  1. @Component
  2. public class Task {
  3.  
  4. @Async
  5. public void doTaskOne() throws Exception {
  6. // 同上内容,省略
  7. }
  8. }

为了让@Async注解能够生效,还需要在Spring Boot的主程序中配置@EnableAsync,如下所示:

  1. @SpringBootApplication
  2. @EnableAsync
  3. public class Application {
  4.  
  5. public static void main(String[] args) {
  6. SpringApplication.run(Application.class, args);
  7. }
  8.  
  9. }

注: @Async所修饰的函数不要定义为static类型,这样异步调用不会生效

★  @EnableTransactionManagement   // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />

关于事务管理器,不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依赖,框架会默认注入 DataSourceTransactionManager 实例。如果你添加的是 spring-boot-starter-data-jpa 依赖,框架会默认注入 JpaTransactionManager 实例。你可以在启动类中添加如下方法,Debug测试,就能知道自动注入的是 PlatformTransactionManager 接口的哪个实现类。

  1. @EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />
  2. @SpringBootApplication
  3. public class ProfiledemoApplication {
  4.  
  5. @Bean
  6. public Object testBean(PlatformTransactionManager platformTransactionManager){
  7. System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());
  8. return new Object();
  9. }
  10.  
  11. public static void main(String[] args) {
  12. SpringApplication.run(ProfiledemoApplication.class, args);
  13. }
  14. }

这些SpringBoot为我们自动做了,这些对我们并不透明,如果你项目做的比较大,添加的持久化依赖比较多,我们还是会选择人为的指定使用哪个事务管理器。 
代码如下:

  1. @EnableTransactionManagement
  2. @SpringBootApplication
  3. public class ProfiledemoApplication {
  4.  
  5. // 其中 dataSource 框架会自动为我们注入
  6. @Bean
  7. public PlatformTransactionManager txManager(DataSource dataSource) {
  8. return new DataSourceTransactionManager(dataSource);
  9. }
  10.  
  11. @Bean
  12. public Object testBean(PlatformTransactionManager platformTransactionManager) {
  13. System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());
  14. return new Object();
  15. }
  16.  
  17. public static void main(String[] args) {
  18. SpringApplication.run(ProfiledemoApplication.class, args);
  19. }
  20. }

在Spring容器中,我们手工注解@Bean 将被优先加载,框架不会重新实例化其他的 PlatformTransactionManager 实现类。

然后在Service中,被 @Transactional 注解的方法,将支持事务。如果注解在类上,则整个类的所有方法都默认支持事务。

对于同一个工程中存在多个事务管理器要怎么处理,请看下面的实例,具体说明请看代码中的注释。

  1. @EnableTransactionManagement // 开启注解事务管理,等同于xml配置文件中的 <tx:annotation-driven />
  2. @SpringBootApplication
  3. public class ProfiledemoApplication implements TransactionManagementConfigurer {
  4.  
  5. @Resource(name="txManager2")
  6. private PlatformTransactionManager txManager2;
  7.  
  8. // 创建事务管理器1
  9. @Bean(name = "txManager1")
  10. public PlatformTransactionManager txManager(DataSource dataSource) {
  11. return new DataSourceTransactionManager(dataSource);
  12. }
  13.  
  14. // 创建事务管理器2
  15. @Bean(name = "txManager2")
  16. public PlatformTransactionManager txManager2(EntityManagerFactory factory) {
  17. return new JpaTransactionManager(factory);
  18. }
  19.  
  20. // 实现接口 TransactionManagementConfigurer 方法,其返回值代表在拥有多个事务管理器的情况下默认使用的事务管理器
  21. @Override
  22. public PlatformTransactionManager annotationDrivenTransactionManager() {
  23. return txManager2;
  24. }
  25.  
  26. public static void main(String[] args) {
  27. SpringApplication.run(ProfiledemoApplication.class, args);
  28. }
  29.  
  30. }
  1. @Component
  2. public class DevSendMessage implements SendMessage {
  3.  
  4. // 使用value具体指定使用哪个事务管理器
  5. @Transactional(value="txManager1")
  6. @Override
  7. public void send() {
  8. System.out.println(">>>>>>>>Dev Send()<<<<<<<<");
  9. send2();
  10. }
  11.  
  12. // 在存在多个事务管理器的情况下,如果使用value具体指定
  13. // 则默认使用方法 annotationDrivenTransactionManager() 返回的事务管理器
  14. @Transactional
  15. public void send2() {
  16. System.out.println(">>>>>>>>Dev Send2()<<<<<<<<");
  17. }
  18.  
  19. }

注:   如果Spring容器中存在多个 PlatformTransactionManager 实例,并且没有实现接口 TransactionManagementConfigurer 指定默认值,在我们在方法上使用注解 @Transactional 的时候,就必须要用value指定,如果不指定,则会抛出异常。

对于系统需要提供默认事务管理的情况下,实现接口 TransactionManagementConfigurer 指定。

对有的系统,为了避免不必要的问题,在业务中必须要明确指定 @Transactional 的 value 值的情况下。不建议实现接口 TransactionManagementConfigurer,这样控制台会明确抛出异常,开发人员就不会忘记主动指定。

来源: https://www.cnblogs.com/xingzc/p/6029483.html

@EnableConfigurationProperties、@EnableAsync、 @EnableTransactionManagement的更多相关文章

  1. 007-Spring Boot-@Enable*注解的工作原理-EnableConfigurationProperties、ImportSelector、ImportBeanDefinitionRegistrar

    一.@Enable* 启用某个特性的注解 1.EnableConfigurationProperties 回顾属性装配 application.properties中添加 tomcat.host=19 ...

  2. Spring 和 SpringMVC 常用注解和配置(@Autowired、@Resource、@Component、@Repository、@Service、@Controller的区别)

    Spring 常用注解 总结内容 一.Spring部分 1.声明bean的注解 2.注入bean的注解 3.java配置类相关注解 4.切面(AOP)相关注解 5.事务注解 6.@Bean的属性支持 ...

  3. Spring Boot -- Spring Boot之@Async异步调用、Mybatis、事务管理等

    这一节将在上一节的基础上,继续深入学习Spring Boot相关知识,其中主要包括@Async异步调用,@Value自定义参数.Mybatis.事务管理等. 本节所使用的代码是在上一节项目代码中,继续 ...

  4. 006-优化web请求二-应用缓存、异步调用【Future、ListenableFuture、CompletableFuture】、ETag、WebSocket【SockJS、Stomp】

    四.应用缓存 使用spring应用缓存.使用方式:使用@EnableCache注解激活Spring的缓存功能,需要创建一个CacheManager来处理缓存.如使用一个内存缓存示例 package c ...

  5. Spring Boot多数据源配置(一)durid、mysql、jpa整合

    目前在做一个统计项目.需要多数据源整合,其中包括mysql和mongo.本节先讲mysql.durid.jpa与spring-boot的整合. 引入Durid包 <dependency> ...

  6. Feign、httpclient、OkHttp3 结合使用

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 疯狂创客圈 正在进行分布式和高并发基础原理 的研习,比如下面的一些基础性的内容: 一.Netty Redis 亿级流量 ...

  7. SpringBoot官方文档学习(三)配置文件、日志、国际化和JSON

    一.Profiles Spring配置文件提供了一种方法来隔离应用程序配置的各个部分,并使其仅在某些环境中可用.任何@Component.@Configuration或@ConfigurationPr ...

  8. Mybatis Plus带多条件的多表联合、分页、排序查询

    目录 一.现有表 student学生表: facultylist学院表: 二.同时满足以下需求: 1.多表联合查询出学院名字 2.可以带多条件查询 3.指定页码,页数据大小进行物理分页查询 三.解决步 ...

  9. SpringBoot与缓存、消息、检索、任务、安全与监控

    一.Spring抽象缓存 Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口 ...

随机推荐

  1. 尚学堂java 答案解析 第四章

    本答案为本人个人编辑,仅供参考,如果读者发现,请私信本人或在下方评论,提醒本人修改 一.选择题 1.BD 解析:B:类必须有构造方法,若程序未写,这系统自动调用系统构造方法. D:super()会调用 ...

  2. 利用VisualVm和JMX远程监控Java进程

    自Java 6开始,Java程序启动时都会在JVM内部启动一个JMX agent,JMX agent会启动一个MBean server组件,把MBeans(Java平台标准的MBean + 你自己创建 ...

  3. day14-python异常处理

    1.     异常 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当Pyt ...

  4. DeepLearning4J

    http://blog.csdn.net/nysyxxg/article/details/52554734

  5. Python Django 之 简单入门

    一.下载Django并安装 1.下载Django 2.安装 二.新建Django project 1.使用django-admin新建mysite 项目 django-admin startproje ...

  6. JXL生成Excel,并提供下载(2:提供下载)

    实现效果: 项目中使用JXL生成Excel,使生成的Excel可以让用户下载,如下图 一.生成Excel 二.提供下载 实现思路: 1.页面使用form表单提交方式(Ajax提交方式,我这里不行) 2 ...

  7. vue.set动态新增对象属性,触发dom渲染

    当我们给一个props或者data中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用Vue.set方法 /** * ==== 选择产品 ==== * 因为vue实现双向数据绑定的机制是数据劫 ...

  8. 3.9 C++多继承

    参考:http://www.weixueyuan.net/view/6366.html 总结: C++中一个派生类中允许有两个及以上的基类,我们称这种情况为多继承 使用多继承可以描述事物之间的组合关系 ...

  9. Linux下安装微信(转)

    扩展:https://www.cnblogs.com/dunitian/p/9124806.html 安装过程如下: 1.下载最新版本tar.gz压缩包https://github.com/geeee ...

  10. mysql修改lower_case_table_names产生的问题

    1.参数含义: lower_case_table_names: 此参数不可以动态修改,必须重启数据库 lower_case_table_names = 1 表名存储在磁盘是小写的,但是比较的时候是不区 ...