Spring Boot

什么是spring boot

Java的大型企业级项目开发繁多的配置、低下的开发效率、复杂的部署流程及第三方技术集成难度大。在上述的环境下,SpringBoot应运而生,
它使用“习惯优先配置”(项目中存在大量的配置,此外还内置一个习惯性的配置,让你无须手动进行配置)的原则。使用它容易创建一个独立运行
(运行jar、内嵌Servlet容器)、准生产级别的基于Spring框架的项目(不用或者只需很少的Spring配置) SpringBoot是一个快速开发框架,快速的将一些常用的第三方依赖整合(原理:通过Maven子父工程的方式),简化XML配置,全部采用注解形
式,内置Http服务器(Jetty和Tomcat),最终以java应用程序进行执行。

 核心思想: 构建一切、定位一切、连接一切。

Spring Boot的优缺点

优点:
1.快速构建项目     
2.对主流开发框架的无配置集成 
3.项目可独立运行,无须外部依赖Servlet容器 
4.提供运行时的应用监控 
5.极大的提高了开发、部署效率  简化配置 
6.与云计算的天然集成
缺点:
1.从原来的xml配置方式转换到JAVA配置方式变化有点大,不太适应。
2.至少要了解spring,才能很容易上手。

入门案例

设置spring bootparent

maven父项目中加入

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
</parent>

导入spring bootweb支持

子项目导入依赖
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
</dependency>

编写Spring Boot应用主程序

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DeptApplication {
    public static void main(String[] args) {
        SpringApplication.run(DeptApplication.class);
    }
}

编写控制器

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class DeptController {
    @RequestMapping("/insert")
    @ResponseBody
    public String insert(){
        System.out.println("控制器insert()......");
        return "success";
    }
    /**由于springboot默认不支持jsp,所以有404*/
    @RequestMapping("/update")
    public String update(){
        System.out.println("控制器update()......");
        return "success";
    }
}

启动应用

直接在main方法中执行

测试

打开浏览器,输入地址:
http://localhost:8080/insert
http://localhost:8080/update

SpringBoot核心原理和重点

1.基于SpringMVC无配置文件(纯Java)完全注解化+内置tomcat-embed-core实现SpringBoot框架,Main函数启动。
2. SpringBoot核心快速整合第三方框架原理:Maven继承依赖关系

springBoot框架流程

问题:  springboot没有配置文件,如何进行初始化?
在没有web.xml配置文件的情况,通过java代码操作整个SpringMVC的初始化过程,java代码最终会生成class文件,
内置Tomcat就会加载这些class文件,当所有程序加载完成后,项目就可以访问了。 流程: 先创建Tomcat容器,然后加载class文件,加载过程中如果发现有java代码编写的SpringMVC初始化,就会创建SpringMVC容器。所有程序执行完毕后,项目就可以访问了。

全局配置文件

命名:   application.yml:(注意空格)

内容:  
server:
  port: 8080

logging:
  config: classpath:logback-boot.xml

spring:
  mvc:
    view:
      prefix: /
      suffix: .jsp

加载xml 配置文件

@ImportResource({"classpath:application-Context.xml"})

日志

logback-boot.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】--> <!-- appender是configuration的子节点,是负责写日志的组件。 --> <!-- ConsoleAppender:把日志输出到控制台 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d %p (%file:%line)- %m%n</pattern> <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 --> <charset>UTF-8</charset> </encoder> </appender> <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 --> <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是demo.log --> <!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名 --> <appender name="demolog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>log/demo.log</File> <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 --> <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 --> <!-- 文件名:log/demo.2018-12-05.0.log --> <fileNamePattern>log/demo.%d.%i.log</fileNamePattern> <!-- 每产生一个日志文件,该日志文件的保存期限为30天 --> <maxHistory>30</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成1KB看效果 --> <maxFileSize>1KB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <!-- pattern节点,用来设置日志的输入格式 --> <pattern> %d %p (%file:%line)- %m%n </pattern> <!-- 记录日志的编码:此处设置字符集 - --> <charset>UTF-8</charset> </encoder> </appender> <!-- 控制台输出日志级别 --> <root level="info"> <appender-ref ref="STDOUT" /> </root> <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 --> <!-- com.alibaba为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG --> <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE --> <logger name="com.alibaba.springboot.controller" level="debug"> <appender-ref ref="demolog" /> </logger> </configuration>
自定义日志
Logger log= LoggerFactory.getLogger(DeptController.class);

log.info("this a first myself log");

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes= {启动类.class})
public class TestApplication {
    @Autowired
public XxxService servcie;
    @Test
    public void testXxx() {
        servcie.insert();
    }
}

配置过滤器

定义过滤器:
package com.offcn.springboot.filter;
import javax.servlet.*;
import java.io.IOException;
public class SellFilter  implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init(FilterConfig filterConfig) ");

    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("doFilter......");
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {
        System.out.println("destroy()");
    }
}

配置过滤器:
@Bean
public FilterRegistrationBean filterRegistrationBean() {
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    //指定过滤器
    filterRegistrationBean.setFilter(new SellFilter());
    //过滤器名称
    filterRegistrationBean.setName("RestWebFilter1");
    //设置过滤器拦截路径
    filterRegistrationBean.addUrlPatterns("/*");
    //设置过滤器执行顺序
    filterRegistrationBean.setOrder(1);
    return filterRegistrationBean;

}

配置拦截器

定义拦截器:
package
com.offcn.springboot.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SellInterceptor extends HandlerInterceptorAdapter{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle......"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle......"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion......"); } } 配置拦截器: package com.offcn.springboot.config; import com.offcn.springboot.interceptor.SellInterceptor; import org.springframework.boot.SpringBootConfiguration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @SpringBootConfiguration public class SellInterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SellInterceptor()).addPathPatterns("/logout"); } }

配置定时器

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

@SpringBootConfiguration
@EnableScheduling
public class SellSpringBootConfigBean {
    @Scheduled(cron="0/2 * * * * ?")
    public void startDo(){
        System.out.println("定时器......");
    }
}

配置servlet

定义servlet:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class SellServlet extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet......");
        PrintWriter out = resp.getWriter();
        out.print("{name:admin}");
        out.flush();
        out.close();

    }
}

配置servlet

配置servlet方式一:

@Bean
public ServletRegistrationBean servletRegistrationBean(){
    ServletRegistrationBean servletRegistrationBean=new ServletRegistrationBean(new SellServlet(),"/updateSell");
    return servletRegistrationBean;
}

配置servlet方式二:
需要在主程序加上
@ServletComponentScan(basePackages="cc") 进行全局扫描

@WebServlet("/updateSell")
public class SellServlet extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet......");
        PrintWriter out = resp.getWriter();
        out.print("{name:admin}");
        out.flush();
        out.close();

    }
我凝视这恒星,等待这那场风暴,我已经准备好了
原文地址:https://www.cnblogs.com/cheng5350/p/11587315.html