Spring Boot

简介: 一、Spring Boot介绍Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置。

一、Spring Boot介绍

Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置。
简单来说,它提供了一堆依赖打包,并已经按照使用习惯解决了依赖问题—习惯大于约定。

Spring Boot默认使用tomcat作为服务器,使用logback提供日志记录。
Spring Boot提供了一系列的依赖包,所以需要构建工具的支持:maven 或 gradle。

二、一个简单的springboot pom.xml配置示例

Springboot父工程依赖

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.1.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>

Springboot web启动器依赖

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

三、Springboot注解

1、@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中
@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。
@Configuration 等同于spring的XML配置文件;使用Java代码可以检查类型安全。
@EnableAutoConfiguration 自动配置。
@ComponentScan 组件扫描,可自动发现和装配一些Bean。
@Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。
2、@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。在返回值类型前加上@ResponseBody表示返回结果是json的格式,不会是页面。
3、@EnableAutoConfiguration:Spring Boot自动配置(auto-configuration):尝试根据你添加的jar依赖自动配置你的Spring应用。例如,如果你的classpath下存在HSQLDB,并且你没有手动配置任何数据库连接beans,那么我们将自动配置一个内存型(in-memory)数据库”。你可以将@EnableAutoConfiguration或者@SpringBootApplication注解添加到一个@Configuration类上来选择自动配置。如果发现应用了你不想要的特定自动配置类,你可以使用@EnableAutoConfiguration注解的排除属性来禁用它们。

这个注释告诉SpringBoot“猜”你将如何想配置Spring,基于你已经添加jar依赖项。如果spring-boot-starter-web已经添加Tomcat和Spring MVC,这个注释自动将假设您正在开发一个web应用程序并添加相应的spring设置。
  自动配置被设计用来和“Starters”一起更好的工作,但这两个概念并不直接相关。您可以自由挑选starter依赖项以外的jar包,springboot仍将尽力自动配置您的应用程序。
4、@Bean:相当于XML中的bean,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。
5、@RequestMapping:@RequestMapping(value = {“/”, “/index”})value值为“/”表示根目录,“/index”表示访问路径后面为index,方法如果直接返回字符串,框架默认会去 spring.view.prefix 目录下的 (index拼接spring.view.suffix)页面;如果返回类型为ModelAndView,则是返回页面,页面由返回的ModelAndView对象确定。

@RequestMapping(value = {"/", "/index"})
    public String index(Map<String, Object> model) {
        // 直接返回字符串,框架默认会去 spring.view.prefix 目录下的 (index拼接spring.view.suffix)页面
        // 本例为 /WEB-INF/jsp/index.jsp
        model.put("time", new Date());
        model.put("message", this.hello);
        return "index";
    }

    @RequestMapping("/page")
    public ModelAndView page() {
        ModelAndView model = new ModelAndView();
        model.setViewName("index");
        model.addObject("time", new Date());
        model.addObject("message", this.hello);
        return model;
    }

6、其他
@Autowired自动导入。
@PathVariable获取参数。
@JsonBackReference解决嵌套外链问题。
@RepositoryRestResourcepublic配合spring-boot-starter-data-rest使用。

四、Springboot支持jsp

1、配置application.properties

    # 页面默认前缀目录
    spring.mvc.view.prefix=/WEB-INF/jsp/
    # 响应页面默认后缀
    spring.mvc.view.suffix=.jsp

2、加入依赖

<dependency> 
<groupId>org.apache.tomcat.embed</groupId> 
<artifactId>tomcat-embed-jasper</artifactId> 
<scope>provided</scope> 
</dependency> 
<dependency>
 <groupId>javax.servlet</groupId> 
<artifactId>jstl</artifactId> 
</dependency>

3、使用方法结合@RequestMapping的用法。

五、Springboot支持freemarker

1、配置application.properties

spring.freemarker.allow-request-override=false
spring.freemarker.cache=true
spring.freemarker.check-template-location=true
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=false

2、加入依赖

    <!-- 引入freeMarker的依赖包. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>   

control代码:

@RequestMapping("/freemarker")
    public String freemarker(Map<String, Object> map) {
        map.put("name", "[Angel -- 守护天使]");
        map.put("gender", 1);//gender:性别,1:男;0:女;  

        List<Map<String, Object>> friends = new ArrayList<Map<String, Object>>();
        Map<String, Object> friend = new HashMap<String, Object>();
        friend.put("name", "jack");
        friend.put("age", 30);
        friends.add(friend);
        friend = new HashMap<String, Object>();
        friend.put("name", "jeff");
        friend.put("age", 36);
        friends.add(friend);
        map.put("friends", friends);
        return "freemarker";
    }

freemarker.ftl

<!DOCTYPE html>  
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"  
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">  
    <head>  
        <title>Hello World!</title>  
    </head>  
    <body>  
       <p>  
           welcome ${name}  to freemarker!  
       </p>        


       <p>性别:  
           <#if gender==0><#elseif gender==1><#else>  
              保密     
           </#if>  
        </p>  


       <h4>我的好友:</h4>  
       <#list friends as item>  
           姓名:${item.name} , 年龄${item.age}  
           <br>  
       </#list>  

    </body>  
</html>  

六、Springboot Servlet注册

Springboot中有两种方式可以添加 Servlet、Filter、Listener

1、代码注册通过ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 获得控制,并且要在方法前加上@Bean注解。
SpringBoot启动类上添加代码:

@Bean 
public ServletRegistrationBean servletRegistrationBean() { 
return new ServletRegistrationBean(new JackServlet(), "/xs/*");}

单请求url为xs时,就会调用JackServlet。
对应的JackServlet代码:

package com.dongnao.jack.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class JackServlet extends HttpServlet {

    private static final long serialVersionUID = -8685285401859800066L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("this is jackServlet doposet method");
        PrintWriter pw = resp.getWriter();
        pw.write("hello springboot servlet register by JackServlet");
        pw.flush();
        pw.close();
    }

    @Override
    public void init() throws ServletException {
        // TODO Auto-generated method stub
        super.init();
    }

}

2、在 SpringBootApplication 上使用@ServletComponentScan 注解后,Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码。
SpringBoot启动类上添加注解:

//扫描工程中的Servlet、Filter、Listener
@ServletComponentScan(basePackages = {"com.dongnao.jack"})

servlet类添加@WebFilter(要加上urlPatterns访问路径)就可以访问了,相应的servlet类:

package com.dongnao.jack.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/** 
 * @Description @WebServlet注解的Servlet注册需要@ServletComponentScan注解的扫描
 * @ClassName   JeffServlet 
 * @Date        2017年8月28日 下午2:17:01 
 * @Author      动脑学院-jack
 */
@WebServlet(urlPatterns = "/jeff/*")
public class JeffServlet extends HttpServlet {
    private static final long serialVersionUID = -8685285401859800067L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("this is JeffServlet doposet method");
        PrintWriter pw = resp.getWriter();
        pw.write("hello springboot servlet register by JeffServlet");
        pw.flush();
        pw.close();
    }

    @Override
    public void init() throws ServletException {
        // TODO Auto-generated method stub
        super.init();
    }

}

七、拦截器

Springboot 拦截器

1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。其中preHandle方法返回true就是放行,false就是拦截。

package com.dongnao.jack.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class JackInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println(this.getClass().getName() + "<------>preHandle");
        return true;//返回true就是放行,false就是拦截
    }

    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println(this.getClass().getName() + "<------>postHandle");

    }

    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println(this.getClass().getName()
                + "<------>afterCompletion");

    }

}

2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法,并且需要添加@Configuration注解,让启动器找能够找到。
3、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。

package com.dongnao.jack.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.dongnao.jack.interceptor.JackInterceptor;
import com.dongnao.jack.interceptor.JeffInterceptor;

@Configuration
public class SpringInterceptorRegister extends WebMvcConfigurerAdapter {
    private static final Logger logger = LoggerFactory.getLogger(SpringInterceptorRegister.class);

    /* 
     * 添加spring中的拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new JackInterceptor()).addPathPatterns("/**");//添加拦截路径
        registry.addInterceptor(new JeffInterceptor())
                .addPathPatterns("/freemarker/**");
        super.addInterceptors(registry);
    }
}

自定义拦截器

package com.dongnao.jack.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

/** 
 * @Description 自定义的Serlvlet过滤器 
 * @ClassName   JackFilter 
 * @Date        2017年8月28日 下午2:29:50 
 * @Author      动脑学院-jack
 */
@WebFilter(filterName = "jackFilter", urlPatterns = "/*")
public class JackFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;
        System.out.println(req.getRequestURL() + "------>doFilter");
        chain.doFilter(request, response);
    }

    public void destroy() {
        // TODO Auto-generated method stub

    }

}

八、Springboot 静态资源处理

1、Spring Boot 的默认资源映射
其中默认配置的 /**映射到 /static (或/public、/resources、/META-INF/resources)
其中默认配置的 /webjars/** 映射到 classpath:/META-INF/resources/webjars/ 上面的 static、public、resources 等目录都在 classpath: 下面(如 src/main/resources/static)。

2、自定义资源映射
继承 WebMvcConfigurerAdapter 并重写方法 addResourceHandlers
registry.addResourceHandler(“/image/**”).addResourceLocations(“file:H:/image/”);
registry.addResourceHandler(“/image1/**”).addResourceLocations(“classpath:/img1/”)

package com.dongnao.jack.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.dongnao.jack.interceptor.JackInterceptor;
import com.dongnao.jack.interceptor.JeffInterceptor;

@Configuration
public class SpringInterceptorRegister extends WebMvcConfigurerAdapter {
    private static final Logger logger = LoggerFactory.getLogger(SpringInterceptorRegister.class);    
    /* 
     * 注册静态文件的自定义映射路径
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
         //image/**  这个是url请求路径
        //classpath:/image/ 去这个路径下寻找静态文件
        registry.addResourceHandler("/image/**")
                .addResourceLocations("classpath:/image/");
        registry.addResourceHandler("/picture/**")
                .addResourceLocations("file:D:/picture/");
        super.addResourceHandlers(registry);
    }
}

3、通过配置文件映射
使用 spring.mvc.static-path-pattern 可以重新定义pattern,如修改为 /image/**
使用 spring.resources.static-locations 可以重新定义 pattern 所指向的路径,支持 classpath: 和 file:

目录
相关文章
|
22天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
38 0
|
1天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
4 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
|
3天前
|
XML Java C++
【Spring系列】Sping VS Sping Boot区别与联系
【4月更文挑战第2天】Spring系列第一课:Spring Boot 能力介绍及简单实践
28 0
【Spring系列】Sping VS Sping Boot区别与联系
|
2月前
|
XML 监控 druid
【Java专题_02】springboot+mybatis+pagehelper分页插件+druid数据源详细教程
【Java专题_02】springboot+mybatis+pagehelper分页插件+druid数据源详细教程
|
3月前
|
Java
springboot项目打包瘦身
springboot项目打包瘦身
|
5月前
|
Java 测试技术
Springboot集成JUnit5优雅进行单元测试
Springboot集成JUnit5优雅进行单元测试
|
安全 Java Maven
Spring Boot资源文件问题总结(Spring Boot的静态资源访问,配置文件外置)
Spring Boot资源文件问题总结(Spring Boot的静态资源访问,配置文件外置)
1295 1
|
9月前
|
Java Maven
【Springboot】创建boot工程spring-boot-maven-plugin报红、出错_解决方案
【Springboot】创建boot工程spring-boot-maven-plugin报红、出错_解决方案
313 0
|
9月前
|
SQL druid 前端开发
让SpringBoot不需要Controller、Service、DAO、Mapper,卧槽!这款工具绝了!
让SpringBoot不需要Controller、Service、DAO、Mapper,卧槽!这款工具绝了!
|
11月前
|
Java C++ Spring
Spring Boot - ConfigDataEnvironmentPostProcessor(Boot 2.4)搞定配置文件加载优先级
Spring Boot - ConfigDataEnvironmentPostProcessor(Boot 2.4)搞定配置文件加载优先级
236 0