曹旭辉 发表于 2024-4-17 20:20:40

使用纯注解替换Spring配置文件&SpringMVC配置文件

创建初始化类,替换web.xml


[*]在Servlet3.0环境中,Web容器(Tomcat)会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。
[*]Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现WebApplicationInitializer的类并将配置的任务交给它们来完成。
[*]Spring3.2引入了一个便利的WebApplicationInitializer基础实现,名为AbstractAnnotationConfigDispatcherServletInitializer,当我们的类扩展了AbstractAnnotationConfigDispatcherServletInitializer并将其部署到Servlet3.0容器的时候,容器会自动发现它,并用它来配置Servlet上下文。
/**
* @Author: lisong
* @CreateTime: 2024-01-31 17:36 星期三
* @Description: 当前类替换web.xml配置文件
*/
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {

    //设置spring配置类,替代spring.xml配置文件
    @Override
    protected Class<?>[] getRootConfigClasses() {
      return new Class[]{SpringConfig.class};
    }

    //设置springmvc配置类,替代springmvc.xml配置文件
    @Override
    protected Class<?>[] getServletConfigClasses() {
      return new Class[]{SpringMVCConfig.class};
    }

    //设置SpringMVC的前端控制器DispatcherServlet的url-patten
    @Override
    protected String[] getServletMappings() {
      return new String[]{"/"};
    }

    //设置当前工程的过滤器
    @Override
    protected Filter[] getServletFilters() {
      //创建字符编码过滤器对象
      CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
      //设置字符编码
      characterEncodingFilter.setEncoding("UTF-8");
      //设置请求和响应的编码
      characterEncodingFilter.setForceEncoding(true);

      //创建rest风格请求方式的过滤器对象
      HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
      return new Filter[]{characterEncodingFilter,hiddenHttpMethodFilter};
    }
}创建Sping配置类,替换Spring的配置文件

@Configurable
@PropertySource("classpath:jdbc.properties")
public class SpringConfig {
    //声明成员属性
    @Value("${jdbc.driver}") //将jdbc.properties中的信息初始化到属性中
    private String driver;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    //配置数据源
    @Bean
    public DruidDataSource dataSource() {
      DruidDataSource dataSource = new DruidDataSource();
      dataSource.setDriverClassName(driver);
      dataSource.setUrl(url);
      dataSource.setUsername(username);
      dataSource.setPassword(password);
      return dataSource;
    }

    //配置jdbc模板,将数据源注入到模板中
    @Bean
    public JdbcTemplate jdbcTemplate(DruidDataSource dataSource) {
      JdbcTemplate jdbcTemplate = new JdbcTemplate();
      jdbcTemplate.setDataSource(dataSource);
      return jdbcTemplate;
    }
}jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/dbtest1
jdbc.username=root
jdbc.password=123456创建SpringMVC配置类,替换SpringMVC配置文件

@Configurable //标识为配置类
@ComponentScan(basePackages = {"com.evan"})
@EnableWebMvc //开启mvc注解
public class WebConfig implements WebMvcConfigurer {

    //配置Spring视图模板解析器的相关策略
    @Bean
    public ITemplateResolver templateResolver() {
      //获取当前Web应用的上下文,即Web容器
      WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
      //创建ServletContext对象,注入当前Web应用的上下文
      ServletContextTemplateResolver templateResolver =
                new ServletContextTemplateResolver(webApplicationContext.getServletContext());
      //创建spring视图模板解析器对象
      //SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
      //设置视图字符集
      templateResolver.setCharacterEncoding("UTF-8");
      //设置视图优先级
      templateResolver.setOrder(1);
      //设置视图模式
      templateResolver.setTemplateMode("HTML5");
      //设置视图前缀
      templateResolver.setPrefix("/WEB-INF/views/");
      //设置视图后缀
      templateResolver.setSuffix(".html");
      return templateResolver;
    }

    //生成Spring的模板引擎,并为模板引擎注入模板解析器
    @Bean
    public TemplateEngine templateEngine(ITemplateResolver iTemplateResolver) {
      SpringTemplateEngine templateEngine = new SpringTemplateEngine();
      templateEngine.setTemplateResolver(iTemplateResolver);
      return templateEngine;
    }

    //生成Thymeleaf视图解析器,并为视图解析器注入spring的模板引擎
    @Bean
    public ViewResolver thymeleafViewResolver(SpringTemplateEngine templateEngine) {
      ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();
      thymeleafViewResolver.setCharacterEncoding("UTF-8");
      thymeleafViewResolver.setOrder(1);
      thymeleafViewResolver.setTemplateEngine(templateEngine);
      return thymeleafViewResolver;
    }

    //配置文件上传解析器
    @Bean
    public CommonsMultipartResolver multipartResolver() {
      return new CommonsMultipartResolver();
    }

    //配置拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
      //创建自定义拦截器实现类对象
      FirstInterceptor firstInterceptor = new FirstInterceptor();
      //配置拦截所有请求路径,排除/hello请求
      registry.addInterceptor(firstInterceptor).addPathPatterns("/**")
                .excludePathPatterns("/hello");
    }

    //配置视图控制器
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
      //设置视图控制器策略
      registry.addViewController("/").setStatusCode(HttpStatus.OK).setViewName("index");
    }

    //配置默认的servlet处理静态资源
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
      //开启默认的servlet静态资源处理
      configurer.enable();
    }

    //配置异常处理器
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
      //创建自定义异常处理器对象
      SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();
      //创建属性对象
      Properties properties = new Properties();
      //注入全类名异常,并指定异常逻辑视图
      properties.setProperty("java.lang.ArithmeticException","error");
      //将异常属性注入到异常映射中
      exceptionResolver.setExceptionMappings(properties);
      //将异常信息注入到请求域中,浏览器可以通过请求域获取异常信息
      exceptionResolver.setExceptionAttribute("ex");
      //添加异常解析器
      resolvers.add(exceptionResolver);
    }
}创建自定义拦截器
@Component
public class FirstInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      System.out.println("FirstInterceptor->preHandle");
      return HandlerInterceptor.super.preHandle(request,response,handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
      System.out.println("FirstInterceptor->postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
      System.out.println("FirstInterceptor->after");
    }
}创建视图index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:target="_blank" href="https://www.cnblogs.com/@{/test/error}">测试异常处理器</a>
</body>
</html>创建视图error.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>错误</title>
</head>
<body>
<h1>error.html</h1>
<hr>
<p th:text="${ex}"/>
</body>
</html>测试

@Controller
public class TestController {

    @GetMapping("/test/error")
    public String testError() {
      System.out.println(10 / 0);
      return "success";
    }
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 使用纯注解替换Spring配置文件&SpringMVC配置文件