SpringBoot
快速的整合第三方框架,简化XML配置,全部采用注解形式,减少冗余代码,内置Tomcat容器,帮助开发者实现快速开发,Web组件默认集成SpringMVC框架
1.pom中引入依赖管理,继承spring-boot-starter-parent项目来获得一些合理的默认配置,dependency的时候就不需要version了
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>*.*.*.RELEASE</version> </parent>
2.springweb 核心组件spring-boot-starter-web、
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
3.启动springboot
main方法里:SpringApplication.run(当前类.class, args);
@RestController:修饰类所有的方法返回JSON格式,直接可以编写Restful接口
@RequestMapping:请求地址映射,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
@EnableAutoConfiguration:让Spring Boot根据应用所声明的依赖来对Spring框架进行自动配置
@ComponentScan(basePackages = "路径"):控制器扫包范围
@SpringBootApplication:提供了统一的注解来替代 @Configuration、@EnableAutoConfiguration、@ComponentScan。加在启动类上,即当前包下或者子包下所有的类都可以扫到
4.创建SpringBoot整合JSP,一定要为war类型,否则会找不到页面。用@Controller修饰类。JSP页面存放在/WEB-INF/jsp/
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency>
5.全局捕获异常:
@ExceptionHandler 表示拦截异常
@ControllerAdvice
(1)controller 的一个辅助类,最常用的就是作为全局异常处理的切面类。可以指定扫描范围
(2)约定了几种可行的返回值,如果是直接返回 model 类的话,需要使用 @ResponseBody 进行 json 转换;返回 String,表示跳到某个 view
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(RuntimeException.class) @ResponseBody public Map<String, Object> exceptionHandler() { Map<String, Object> map = new HashMap<String, Object>(); map.put("errorCode", "101"); map.put("errorMsg", "系統错误!"); return map; } }
5.使用aop统一处理Web请求日志:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j</artifactId> <version>*.*.*.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
切面类代码展示
@Aspect @Component public class WebLogAspect { private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class); @Pointcut("execution(public * 一级目录.二级目录.三级目录.*.*(..))") public void webLog() { } @Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Throwable { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 记录请求内容 logger.info("URL : " + request.getRequestURL().toString()); logger.info("HTTP_METHOD : " + request.getMethod()); logger.info("IP : " + request.getRemoteAddr()); Enumeration<String> enu = request.getParameterNames(); while (enu.hasMoreElements()) { String name = (String) enu.nextElement(); logger.info("name:{},value:{}", name, request.getParameter(name)); } } @AfterReturning(returning = "ret", pointcut = "webLog()") public void doAfterReturning(Object ret) throws Throwable { // 处理完请求,返回内容 logger.info("RESPONSE : " + ret); } }
6.spring事务@transactional默认开启,分类:声明事务、编程事务,不要try,将异常抛出给外层
7.多线程,启动加上@EnableAsync,需要执行异步方法上加入 @Async
8.多数据源:分包或者注解方式
分包:两个项目包,修改application.properties文件配置信息,两个自定义数据源,再新增两个java分别读取两个不同的数据源信息
@Configuration // 注册到springboot容器中 @MapperScan(basePackages = "其中一个项目包路径com.ddd.test1", sqlSessionFactoryRef = "test1SqlSessionFactory") public class DataSource1Config { //功能描述:(配置test1数据库) @Bean(name = "test1DataSource") @ConfigurationProperties(prefix = "spring.datasource.test1") @Primary public DataSource testDataSource() { return DataSourceBuilder.create().build(); } //功能描述:(test1 sql会话工厂) @Bean(name = "test1SqlSessionFactory") @Primary public SqlSessionFactory testSqlSessionFactory( @Qualifier("test1DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean.getObject(); } //功能描述:(test1 事物管理) @Bean(name = "test1TransactionManager") @Primary public DataSourceTransactionManager testTransactionManager( @Qualifier("test1DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "test1SqlSessionTemplate") @Primary public SqlSessionTemplate testSqlSessionTemplate(@Qualifier( "test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
在多数据源的情况下,使用@Transactional注解时,应该指定事务管理者
@Transactional(transactionManager = "test1TransactionManager")
9.jta-atomikos分布式事物管理
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jta-atomikos</artifactId> </dependency>
10.热部署spring-boot-devtools,使用了两个ClassLoader,一个加载那些不会改变的类(第三方Jar包),另一个加载会更改的类,称为restart ClassLoader,在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,实现热部署,且需要加载的类相比较少。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <scope>true</scope> </dependency>
11.缓存:
开启缓存注解@EnableCaching
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
ehcache.xml文件
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"> <diskStore path="java.io.tmpdir/Tmp_EhCache" /> <!-- 默认配置 --> <defaultCache maxElementsInMemory="5000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" memoryStoreEvictionPolicy="LRU" overflowToDisk="false" /> <cache name="baseCache" maxElementsInMemory="10000" maxElementsOnDisk="100000" /> </ehcache>
1.clearOnFlush:内存数量最大时是否清除。
2.name:缓存名称。
3.maxElementsInMemory:缓存最大个数。
4.eternal:对象是否永久有效,一但设置了,timeout将不起作用。
5.timeToIdleSeconds:设置对象失效前允许闲置的时间(单位:秒)。仅当eternal=false,可选属性,默认值是0,也就是可闲置时间无穷大。
6.timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
7.overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
8.diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
9.maxElementsOnDisk:硬盘最大缓存个数。
10.diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
11.diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
12.memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
使用:
@CacheConfig(cacheNames = "baseCache") public interface ***Mapper { @Select("select * from ***s where name=#{name}") @Cacheable ***Entity findName(@Param("name") String name); }
12.监控中心Actuator:
可以监视和管理应用程序。可以使用HTTP的各种请求来监管、审计、收集应用的运行情况。特别有益于微服务管理
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
###通过下面的.yml配置启用所有的监控端点,默认情况下,这些端点是禁用的;
management:
endpoints:
web:
exposure:
include: "*"
访问路径:通过actuator/+端点名可获取相应的信息。
可使用Admin-UI基于actuator实现返回界面展示监控信息
13.性能优化:
1)扫包优化:使用@SpringBootApplication自动扫包会加载一些不需要的多余的实例(beans),增加 CPU 消耗。可以移除 @SpringBootApplication 和@ComponentScan两个注解来禁用组件自动扫描,然后在我们需要的 bean 上进行显式配置
2)JVM参数调优:
内部:-XX:+PrintGCDetails -Xmx128M -Xms128M 。。。
外部:java -server -Xms128m -Xmx128m 。。。 -jar 包名.jar
3)内嵌Tomcat换为Undertow(提供包括阻塞和基于 NIO 的非堵塞机制):pom.xml先排除tomcat依赖,再引入undertow的jar包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency>
14.新特性: