Springboot 2.0学习笔记

 

目录

一、什么是 Spring Boot

二、Spring Boot 与 Spring Cloud的关系

2.1 Spring Cloud

2.2 关系

三、Spring Boot 与 SpringMVC的关系

四、Spring Boot启动方式

4.1 EnableAutoConfiguration + ComponentScan注解

4.2 @SpringBootApplication 注解

五、全局捕获异常

六、AOP统一处理Web请求日志

七、异步调用

八、自定义参数

九、区分多环境配置文件

十、事务管理(待补充)

10.1 事务分类

10.2 事务原理

十一、多数据源

11.1 多数据源划分

11.2 多数据源事务管理

十二、热部署

12.1 热部署原理

12.2 Devtools

十三、Spring Boot 性能优化

13.1 扫包优化

13.2 jvm参数调优

13.3 修改Tomcat容器为Undertow容器

十四、yml使用

十五、打包发布

15.1 Jar方式

15.2 War方式

十六、监控中心


一、什么是 Spring Boot

Spring Boot是一个快速开发框架,能够快速整合第三方常用框架。完全采用注解化、简化xml,最终以Java应用程序进行运行(java -jar)。

Spring Boot 不是微服务框架。

 

二、Spring Boot 与 Spring Cloud的关系

2.1 Spring Cloud

Spring Cloud是一套目前比较完整的微服务解决方案。

2.2 关系

Spring Boot的web组件默认集成SpringMVC,Spring Cloud依赖于Spring Boot实现微服务,使用SpringMVC编写微服务接口。

结论:Spring Boot + Spring Cloud实现微服务。

 

三、Spring Boot 与 SpringMVC的关系

Spring Boot的web组件集成了SpringMVC。

Spring Boot使用注解的方式来启动SpringMVC。SpringMVC在3.0的时候产生了 @EnableWebMvc 注解,可以代替web.xml来启动SpringMVC。

原理:通过Java代码创建Tomcat。

 

四、Spring Boot启动方式

4.1 EnableAutoConfiguration + ComponentScan注解

@EnableAutoConfiguration 注解:自动配置和启动,该注解的扫包范围是只在当前类中。

@ComponentScan注解:配置扫包范围

@EnableAutoConfiguration
@ComponentScan("com.xxx.www.controller")
public class Application {
    public static void main(String[] args) {
        // 整个程序的入口,启动SpringBoot项目
        SpringApplication.run(Application.class, args);
    }
}

4.2 @SpringBootApplication 注解

@SpringBootApplication注解:相当于@EnableAutoConfiguration + @ComponentScan,扫包范围是该类所在同级包和当前包(包括子包)。可以与 @ComponentScan 配合使用。

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        // 整个程序的入口,启动SpringBoot项目
        SpringApplication.run(Application.class, args);
    }
}

 

五、全局捕获异常

整个web请求项目全局捕获异常。

应用场景:在项目编写过程中,可能会出现很多的运行时异常,虽然每个异常都可以用try-catch捕获并处理,但代码会显得很臃肿难看。因此可以使用全局捕获异常技术来进行异常的通用处理。

原理:使用AOP技术,采用异常通知。

/**
 * 全局捕获异常案例
 * 1.捕获返回json格式
 * 2.捕获返回页面
 */
@ControllerAdvice(basePackages = "com.xxx.www.controller")
public class GlobalExceptionHandler {

    // 使用 @ResponseBody, 返回json格式
    // 返回 modeAndView 类型, 返回页面
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public Map<String, Object> errorResult() {
        // 实际开发中,应该将错误记录在日志中。
        Map<String, Object> errorResultMap = new HashMap<String, Object>();
        errorResultMap.put("code", "500");
        errorResultMap.put("msg", "系统错误!");
        return errorResultMap;
    }
}

 

六、AOP统一处理Web请求日志

使用AOP技术进行日志记录。

@Aspect
@Component
public class WebLogAspect {

    private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);

    // 切入点
    @Pointcut("execution(public * com.xxx.www.controller.*.*(..))")
    public void webLog() {
    }

    /**
     * 使用AOP前置通知拦截请求参数信息
     * 前置通知
     */
    @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);
    }
}

 

七、异步调用

“异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。

点击此处参考

使用方式:启动类加上@EnableAsync,需要执行异步方法的地方使用@Async。

 

八、自定义参数

@Value注解:可以从配置文件中获取对应名称的自定义项目参数。执行时间:在初始化的时候就会读取并赋值。

application.properties文件中

name=www.xxx.com

需要用到的地方(IndexController.java)

@RestController
public class IndexController {
    @Value("${name}")
    private String name;
}

 

九、区分多环境配置文件

使用 spring.profiles.active 配置区分配置文件

application.properties文件中

spring.profiles.active=dev

表示加载application-dev.properties配置文件

 

十、事务管理(待补充)

Spring Boot默认集成了事务。在需要使用事务的类或方法上添加 @Transactional 注解即可。

10.1 事务分类

声明式事务

编程式事务

10.2 事务原理

使用AOP技术,利用环绕通知进行拦截。

注意:使用事务时不需要try-catch,因为需要把异常抛出给外层。

10.3事务的默认传播行为:required

 

十一、多数据源

应用场景:公司有两个数据库,一个数据库专门存放共同配置文件,一个数据库负责垂直业务,即一个项目中有多个数据源(多个数据库)。

垂直拆分和水平拆分:垂直是根据业务划分具体的数据库,水平是分表。

11.1 多数据源划分

划分方式:分包名(即根据业务)注解方式

分包方式参考资料:点击此处

11.2 多数据源事务管理

当项目中有多个数据源和多个事务管理器时,Spring Boot不知道该找哪个事务管理器来执行事务,此时,需要手动指定事务管理器。指定方法为在事务注解上指定:

@Transactional(transactionManager = "transactionManager01")
public int insertUser(User user) throws Exception {
    return userService.insertUser(user);
}

 

十二、热部署

12.1 热部署原理

使用类加载器( classloader 重新读取字节码文件到 jvm 内存)

1.监听class文件是否有发生变化——通过文件版本号或修改时间。

2.如果发生改变,使用 classloader 进行重新读取。

思考:热部署是否可以用于生产环境?

答:理论上可以,但不安全,所以不推荐,一般用于本地开发。

热部署缺点:如果项目较大,会非常卡,比较占用内存。

12.2 Devtools

Spring Boot 集成的热部署框架。Devtools的热部署原理是重启项目而不是使用类加载,所以效率会极低。不推荐使用。

 

十三、Spring Boot 性能优化

13.1 扫包优化

注意:扫包优化指优化启动速度。

原理:@SpringBootApplication 默认会扫当前包和同级包,使用递归遍历的方式扫子包和类。可能会扫到无用的包。使用 @ComponentScan 只扫controller和service层 + @EnableAutoConfiguration 的方式启动,可以减少部分启动时间。

13.2 jvm参数调优

参数调优对启动速度影响不大,主要影响运行整体速度(比如吞吐量:默认每秒完成的请求数量)。

调优策略:初始化堆内存与最大相同(默认最大4G,但初始化不是),并给予足够的大小,可以大量减少gc回收次数。

内部调优(感觉没啥用): 在eclipse启动项目时配置:-XX:+PrintGCDetails -Xmx4096M -Xms4096M

-Xmx:最大堆内存大小

-Xms:初始化堆内存大小

外部调优:命令启动jar包时:java -server -Xmx4096M -Xms4096M -jar xxx.jar

13.3 修改Tomcat容器为Undertow容器

Undertow:也是一个web服务器,属于JBoss旗下。点击此处了解。

Spring Boot默认web容器是Tomcat,而Tomcat的吞吐量大概在5000,而Undertow的吞吐量大约在8000,明显优于Tomcat。

使用Undertow

pom.xml

<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>

 

十四、yml使用

Spring Boot默认读取application.yml 或 application.properties 文件。

yml的好处:yml比properties配置文件结构更加清晰,也更简洁。

yml基本语法链接

 

十五、打包发布

15.1 Jar方式

1. pom.xml中需要配置指定打包方式为jar,指定入口

<packaging>jar</packaging>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.itmayiedu.App</mainClass>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2.使用命令

mvn package:maven打包命令

mvn clean install:maven清理并重新打包

15.2 War方式

如果项目中有用到 jsp,则必须使用war类型打包。

Spring Boot 2.0 内置的Tomcat版本在8.5.25以上,所以使用外部低版本的Tomcat运行Spring Boot 2.0项目的war包可能会出现依赖jar包不兼容的情况,所以建议使用8.5.25以上版本的Tomcat。

1.pom.xml指定打包方式为war,指定入口

<packaging>war</packaging>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.itmayiedu.App</mainClass>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

十六、监控中心

什么是Spring Boot的监控中心(actuator)

针对微服务的服务状态、Http请求资源的监控。可以服务配置链接地址是否可用。

Spring Boot对MySQL的连接默认是懒加载的。

actuator本身没有可视化界面,AdminUI集成actuator实现可视化监控界面。

AdminUi

AdminUi底层使用Actuator监控应用,实现可视化界面

原理(类似于注册中心(比如eureka)):

1、将所有服务的监控中心管理存放在adminUi上。被监控服务内部集成Actuator监控应用,并注册到adminUi平台。

2、AdminUi平台接收到注册的服务的json数据并进行解析、展示。

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值