美文网首页
Spring Boot

Spring Boot

作者: saoraozhe3hao | 来源:发表于2018-10-15 16:07 被阅读0次

    历史:Pivotal公司2014年发布 Spring Boot
    特性:简化Spring应用的初始搭建过程和开发过程、可以打成可运行的Jar包(内嵌Tomcat)
    原理:通过starter封装来减少配置;通过自动扫描被注解的类和方法来装配Bean,取代xml配置

    概念
    YAML:YAML Ain’t Markup Language,Clark Evans在2001年发表了这种语言

    Spring Boot 应用搭建

    1、到Spring官网打开 Spring Initializr,配置依赖Web,下载初始化项目,项目名以Demo为例
    2、用IDEA打开,右侧“Maven Projects”添加pom.xml,加载完依赖以后才会显示完整目录
    3、属性配置 resources/application.properties

    server.port=8081                    # 端口
    server.context-path=/myapp  # 路径前缀
    server.error.path=/error   # 出错跳转
    server.session-timeout=60 # 会话超时时间
    server.tomcat.uri-encoding=UTF-8
    server.tomcat.basedir=/temp  # 默认为 /tmp,/tmp下的目录长时间不访问的话,会被删除
    spring.mvc.async.request-timeout=20000  # 请求超时时间
    

    4、新建Controller
    MyController.java

    @RestController
    public class MyController {
        @Value("${server.port}")   // 引用配置的值
        private String port;
        @RequestMapping("/hello")
        public String Hello(){
            return "Hello World";
        }
    }
    

    5、运行DemoApplication.java
    里面的@SpringBootApplication包含了@EnableAutoConfiguration,实现Bean自动装配
    6、访问 http://localhost:8081/hello

    打包与运行

    打包:mvn package
    运行:java -jar demo.jar

    yum配置

    application.properties 改成 application.yml

    server:
      port: 8081
    spring:
      servlet:
        multipart:
          enabled: true
          max-file-size: 30MB
          max-request-size: 30MB   # 最大上传尺寸
    content: "port is ${port}"  # 引用前面定义的值
    

    配置类

    @Configuration
    @MapperScan("Mapper所在包")  // 简化 MapperScannerConfigurer 配置
    public  class Configuration{
        // 用注解方法的方式来装载Bean
        @Bean
        public FilterRegistrationBean corsFilter() {     // 允许跨域配置
            CorsConfiguration config = new CorsConfiguration();
            config.setAllowCredentials(true);
            config.addAllowedOrigin(CorsConfiguration.ALL);
            config.addAllowedHeader(CorsConfiguration.ALL);
            config.addAllowedMethod("OPTIONS");  // AllowedMethod 必须罗列,而不能用通配符 *
            config.addAllowedMethod("HEAD");
            config.addAllowedMethod("GET");
            config.addAllowedMethod("PUT");
            config.addAllowedMethod("POST");
            config.addAllowedMethod("DELETE");
            config.addAllowedMethod("PATCH");
    
            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            source.registerCorsConfiguration("/**", config);
            FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
            bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
    
            return bean;
        }
    }
    

    AOP方式记日志

    1、配置Maven依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    

    2、切片类

    @Aspect
    @Component
    public class MyAspect {
        @Before("execution(public * com.hogen.demo.controllers.MyController.*(..))")  // 切点
        public void log(JoinPoint joinPoint){
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            log(request.getRequestURI());   // 获取请求信息
            log(joinPoint.getSignature().getName());  // 获取目标方法的信息
        }
    
        @After("execution(public * com.hogen.demo.controllers.MyController.*(..))")
        public void doAfter(){  }
    
        @AfterReturning(pointcut="execution(public * com.hogen.demo.controllers.MyController.*(..))", returning = "object")
        public void afterReturn(Object object){  // 处理返回值
            log(object.toString()); 
        }
    }
    

    统一返回格式

    1、结果类

    public class Result<T> {
        @JsonIgnore   // 使得@ResponseBody忽略这个字段。这个注解由Jackson提供,Jackson还提供别的字段处理注解
        private Integer code;
        private String msg;
        private T data;
    }
    2、异常处理类
    ```java
    @ControllerAdvice
    public class ExceptionHandle {
        @ExceptionHandler(value = Exception.class)
        @ResponseBody
        public Result handle(Exception e){
            Result result = new Result();
            result.setCode(1);  // code也需要定制的话,可以扩展RuntimeException,增加code成员。Controller抛出new MyException(2, "我是异常"),这里就可以获取code
            result.setMsg(e.getMessage());
            result.setData(null);
            return result;
        }
    
        @ExceptionHandler(value = MethodArgumentNotValidException.class)  // 根据特定异常,返回特定信息
        @ResponseBody
        public RestfulResult handle(MethodArgumentNotValidException e) {
            return new Result(100, "参数错误");
        }
    }
    

    3、Controller

    @RestController  // 等效于 @Controller + @ResponseBody
    public class MyController {
        @RequestMapping("/hello")
        public Result<String> Hello() throws Exception{   // 正常返回
            Result result = new Result();
            result.setCode(0);
            result.setMsg("没事");
            result.setData("Hello World");
            return result;
        }
    
        @RequestMapping("/hello1")
        public Result<String> Hello1() throws Exception{  // 异常返回
            throw new Exception("我是异常");   // 会被捕获交给异常处理类
        }
    }
    

    定时任务

    @EnableScheduling
    @Component
    public class MyJobs {
        @Scheduled(fixedRate = 3000)  // 隔3000毫秒
        @Scheduled(cron = "cron表达式") // cron表达式生成器 http://cron.qqe2.com/
        public void task(){
            System.out.println(44);
        }
    }
    

    异步方法

    1、含有异步方法的类

    @Component
    @EnableAsync
    public class AsyncTasks {
        @Async
        public Future<Boolean> job() throws Exception{
            Thread.sleep(1000);
            System.out.println(0);
            return new AsyncResult<>(true);
        }
        @Async
        public Future<Boolean> task(){
            System.out.println(1);
            return new AsyncResult<>(true);
        }
    }
    

    2、使用

    @Autowired
    private AsyncTasks asyncTasks;
    
    // 两个异步方法并行
    Future<Boolean> future1 = asyncTasks.job();
    Future<Boolean> future2 = asyncTasks.task();  
    while (!future1.isDone() || !future2.isDone()){
        Thread.sleep(10);
    }
    return "结束";
    

    拦截器

    注册拦截器

    @Configuration
    public class WebMvcConfigurer extends WebMvcConfigurationSupport {
        @Override
        public void addInterceptors(InterceptorRegistry registry){
            registry.addInterceptor(new RoleInterceptor()).addPathPatterns("/**");
            super.addInterceptors(registry);
        }
    }
    

    场景 Profile

    分配置方法一:resources下放四个文件application.yml、application-dev.yml、application-test.yml、application-prod.yml
    分配置方法二:只写一个文件,以---隔开

    spring:
      profiles: 
        active: prod
    ---
    spring: 
      profiles: dev  
    server: 
      port: 8080  
    ---
    spring: 
      profiles: test
    server: 
      port: 8081    
    

    分配在方法三:要在不同环境使用不同Bean,可以加注解 @Profile("prod"),与@Configuration和@Component配合使用

    场景激活方法一:application.yml

    spring:
        profiles:
            active: dev
    

    场景激活方法二:java -jar springbootdemo.jar -- spring.profiles.active=dev
    场景激活方法三:IDEA中配置SpringBoot启动参数--spring.profiles.active=dev

    这里是启动时指定环境,要打包时指定环境,可以使用Maven profile

    打war包,部署到Tomcat

    1、pom.xml

    <packaging>war</packaging>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <scope>provided</scope>
            </dependency>
    

    2、入口Java类

    public class XxxxApplication extends SpringBootServletInitializer {
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(XxxxApplication .class);
        }
    }
    

    3、指定启动的profile:
    新建 tomcat/bin/setenv.sh

    export JAVA_OPTS="-Dspring.profiles.active=prod"
    

    4、打出来的war文件,文件名改为ROOT.war,放到tomcat/webapps 下

    HTTPS

    1、把keystore文件 或 pfx文件 放入 resources 目录
    2、配置 application.yml

    server:
      port: 443
      ssl:
        key-store: classpath:文件名.keystore
        key-store-type: JKS  // 或pfx证书对应为 PKCS12 
        key-alias: 别名
        key-store-password: keystore密码
    

    如果SpringBoot打成war包部署道Tomcat,则需要在Tomcat配置https

    相关文章

      网友评论

          本文标题:Spring Boot

          本文链接:https://www.haomeiwen.com/subject/cvwfzftx.html