一图看懂Spring Boot 异步框架
在SpringBoot的日常开发中,一般都是同步调用的。但经常有特殊业务需要做异步来处理,例如:注册新用户,送100个积分,或下单成功,发送push消息等等。
就拿注册新用户为什么要异步处理?
在SpringBoot中使用异步调用是很简单的,只需要使用@Async注解即可实现方法的异步调用。
采用@EnableAsync来开启异步任务支持,另外需要加入@Configuration来把当前类加入springIOC容器中。
增加一个service类,用来做积分处理。
@Async添加在方法上,代表该方法为异步处理。
@Async注解,在默认情况下用的是SimpleAsyncTaskExecutor线程池,该线程池不是真正意义上的线程池,因为线程不重用,每次调用都会新建一条线程。
可以通过控制台日志输出查看,每次打印的线程名都是[task-1]、[task-2]、[task-3]、[task-4].....递增的。
@Async注解异步框架提供多种线程
SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。
SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作。只适用于不需要多线程的地方。
ConcurrentTaskExecutor:Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类。
ThreadPoolTaskScheduler:可以使用cron表达式。
ThreadPoolTaskExecutor :最常使用,推荐。 其实质是对java.util.concurrent.ThreadPoolExecutor的包装。
SpringBoot统一日志框架
通常一个完整的应用下会依赖于多种不同的框架,而且它们记录日志使用的日志框架也不尽相同。我们在使用 Spring Boot 时,同样可能用到其他的框架,这些框架的底层都有自己的日志框架,此时我们也需要对日志框架进行统一。
SLF4J 官方给出的统一日志框架的方案一共需要以下 3 步 :
Soring Boot 作为一款优秀的开箱即用的框架,已经为用户完成了其中 2 步:引入替换包和导入 SLF4J 实现。我们按住Ctrl,点击spring-boot-starter-web,查看spring-boot-starter-web的Maven依赖,可以看到spring-boot-starter,如下图:
我们再按住Ctrl,点击spring-boot-starter,查看spring-boot-starter的Maven依赖,可以看到spring-boot-starter-logging,如下图:
继续按住Ctrl,点击spring-boot-starter-logging,查看spring-boot-starter-logging的Maven依赖,如下图:
从图上我们可以看出spring-boot-starter-logging 的 Maven 依赖不但引入了 logback-classic (包含了日志框架 SLF4J 的实现),还引入了 log4j-to-slf4j(log4j 的替换包),jul-to-slf4j (JUL 的替换包),即 Spring Boot 已经为我们完成了统一日志框架的 3 个步骤中的 2 步。
SpringBoot 底层使用 slf4j+logback 的方式记录日志,当我们引入了依赖了其他日志框架的第三方框架时,只需要把这个框架所依赖的日志框架排除,即可实现日志框架的统一。比如下图:
日志配置
根据项目需要我们还可以在配置文件配置日志的一些属性。如下图:
运行项目我们可以看到配置已经生效了,项目结构中出现了配置的日志输出文件my.log。
springboot启动过程是?
总览:
上图为SpringBoot启动结构图,我们发现启动流程主要分为三个部分,第一部分进行、SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器,第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块。
及核心的创建上下文环境模块,第三部分是自动化配置模块,该模块作为springboot自动配置核心,在后面的分析中会详细讨论。在下面的启动程序中我们会串联起结构中的主要功能。
启动:
每个SpringBoot程序都有一个主入口,也就是main方法,main里面调用SpringApplication.run()启动整个spring-boot程序,该方法所在类需要使用@SpringBootApplication注解。
以及@ImportResource注解(if need),@SpringBootApplication包括三个注解,功能如下:@EnableAutoConfiguration:SpringBoot根据应用所声明的依赖来对Spring框架进行自动配置。
@SpringBootConfiguration(内部为@Configuration):被标注的类等于在spring的XML配置文件中(applicationContext.xml),装配所有bean事务,提供了一个spring的上下文环境。
@ComponentScan:组件扫描,可自动发现和装配Bean,默认扫描SpringApplication的run方法里的Booter.class所在的包路径下文件,所以最好将该启动类放到根包路径下。
Spring Boot(5)一个极简且完整的后台框架
SpringBoot,我也是第一次用,实现了一个极简单的后台框架,希望有不太合理的地方大家给个建议。
Spring Boot(1)工具安装:
Spring Boot(2)新建Spring Boot工程
Spring Boot(3)整合Mybatis
Spring Boot(4)整合thymeleaf
Spring Boot(5)一个极简且完整的后台框架
Spring Boot(6)jar方式打包发布
Spring Boot(7)war方式打包发布
【每天学点Spring】Spring以及Spring Boot框架知识图谱
【参考】
Spring框架以及Spring Boot框架当然是Java最火热的框架之一,罗列了一些知识点:
【解释】
看文档 是最最重要的,所以在RoadMap图中,把它放在第一位。
很多时候我们都会忽略这一点,但其实最准确的解释往往是来自于文档。开发人员花了大量时间来写文档,当然是希望对使用者有所帮助,并且Spring的文档写的也非常全面,所以很有必要好好读一读文档。
Spring 官网:
Spring Framework文档:
从文档首页也能看到Spring框架的分类,所以才说文档很重要:
Spring Boot文档:
谈谈对spring boot分层中各层的理解
1 Dao层:持久层,主要是和数据库进行交互
dao层首先胡创建dao接口,接着就可以在配置文件中定义该接口的实现类;接着就可以在模块中调用dao的接口进行数据业务的处理,而不用关注此接口的具体实现是哪一个类,dao层的数据源和数据库实在配置文件中进行配置的。
2 Entity层:实体层,数据库在项目中的类
主要用于定义与数据库对象的属性,提供get/set方法,带参和无参的构造方法。
3 Service层:业务层控制业务
业务模块的逻辑应用设计,和DAO层一样都是先设计接口,再创建要实现的类,然后在配置文件中进行配置其实现的关联。接下来就可以在service层调用接口进行业务逻辑应用的处理。
好处:封装Service层的业务逻辑有利于业务逻辑的独立性和重复利用性。
4.Controller层:控制层 控制业务逻辑
具体的业务模块流程的控制,controller层主要调用Service层里面的接口控制具体的业务流程,控制的配置也要在配置文件中进行。
Controller和Service的区别是:Controller负责具体的业务模块流程的控制;Service层负责业务模块的逻辑应用设计
总结:具体的一个项目中有:controller层调用了Service层的方法,Service层调用Dao层的方法,其中调用的参数是使用Entity层进行传递的。
补充:5、View层 此层与控制层结合比较紧密,需要二者结合起来协同工发。View层主要负责前台jsp页面的表示