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
运行结果: