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.新特性:

posted @ 2019-08-05 18:01  shuG214xin  阅读(96)  评论(0编辑  收藏  举报