Spring Boot 中加载XML配置

虽然Spring Boot中已经没有了XML配置文件,但是从技术的角度上,我们需要如果在Spring Boot中加载配置文件,那么该如何进行加载,其实很简单,只需要一个注解就可以解决。
首先创建一个bean,这个bean中没有任何注解
package com.choi.xml;

/**
 * @Author ChoiBin
 * @Date 2019-07-30 14:21
 * @Version 1.0
 */
public class SayHello {

    public String sayHello(){
        return "hello!";
    }

} 
在resources中创建beans.xml文件并且配置上面这个bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="com.choi.xml.SayHello" id="sayHello"/>

</beans>
创建一个配置类,这个配置类中需要添加两个注解,@Configuration和@ImportResource(locations = "classpath:beans.xml")
package com.choi.xml;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

/**
 * @Author ChoiBin
 * @Date 2019-07-30 14:22
 * @Version 1.0
 */
@Configuration
@ImportResource(locations = "classpath:beans.xml")
public class WebMvcConfig {
} 
通过这个两个注解,就可以将XML文件进行加载,使用单元测试进行测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class XmlApplicationTests {

    @Autowired
    private SayHello sayHello;
    @Test
    public void contextLoads() {
        System.out.println(sayHello.sayHello());
    }
}
测试结果

Sprint Boot中如何注册***

自己实现一个***,添加到容器当中
package com.choi.interceptor;

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

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

/**
 * @Author ChoiBin
 * @Date 2019-07-30 14:35
 * @Version 1.0
 */
public class MyInterceptor implements HandlerInterceptor {
    @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");

    }
}
新建一个配置类,实现WebMvcConfigurer中的addInterceptors()方法
package com.choi.interceptor;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @Author ChoiBin
 * @Date 2019-07-30 14:37
 * @Version 1.0
 */
@Component
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor()).addPathPatterns("/**");
    }

    @Bean
    public MyInterceptor myInterceptor(){
        return new MyInterceptor();
    }
} 
创建一个controller,进行测试
package com.choi.interceptor;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author ChoiBin
 * @Date 2019-07-30 14:39
 * @Version 1.0
 */
@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }
}
测试结果

Spring Boot中如何整合web基础组件

web基础组件包括:servlet、listener、filter,那么在Spring Boot中又如何进行整合?
分别创建servlet、listener、filter
package com.choi.web;

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;

/**
 * @Author ChoiBin
 * @Date 2019-07-30 14:48
 * @Version 1.0
 */
@WebServlet(urlPatterns = "/myservlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("myservlet");
    }
}
package com.choi.web;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;

/**
 * @Author ChoiBin
 * @Date 2019-07-30 14:51
 * @Version 1.0
 */
@WebListener
public class MyListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("requestDestroyed");
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("requestInitialized");
    }
}
package com.choi.web;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * @Author ChoiBin
 * @Date 2019-07-30 14:49
 * @Version 1.0
 */
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("myfilter");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
在启动类中添加一个注解,启动时将他们加载进项目中
package com.choi.web;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan(basePackages = "com.choi.web")
public class WebApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }

}
访问http://localhost:8080/myservlet,运行结果如下

Spring Boot中的路径映射

在日常开发时,我们有时候需要返回一个动态模板,比如thymeleaf,这种动态模板是放在template目录下的,如果需要访问那么我们就需要创建一个controller来进行访问。
如果一个动态页面,不需要传递任何数据进行页面的渲染,只是进行一次页面跳转,那么我们就没有必要给它写一个controller进行跳转,那么我们又该如何进行映射?Spring MVC和Spring Boot中都提供了方案进行解决。
创建一个配置类
package com.choi.pathmapping;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @Author ChoiBin
 * @Date 2019-07-30 15:07
 * @Version 1.0
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/hello").setViewName("hello");
    }
}
访问http://localhost:8080/hello,运行结果如下:

Spring Boot中使用类型转换器

类型转换在开发中我们是常见的,比如前段状态一个String类型的日期数据,而我们后台是用Data的数据类型来进行接收,这样数据类型对不上,就会发生错误。如下所示

解决方案如下,创建一个类型转换器
package com.choi.paramconverter;

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author ChoiBin
 * @Date 2019-07-30 15:18
 * @Version 1.0
 */
@Component
public class DataConverter implements Converter<String, Date> {

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    @Override
    public Date convert(String s) {
        if(s != null && !"".equals(s)){
            try {
                return simpleDateFormat.parse(s);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}
Converter<String, Date>指的是接收的参数类型是String,需要转换后的类型是Date
运行结果: