胖胖的枫叶
主页
博客
产品设计
企业架构
全栈开发
效率工具
数据分析
项目管理
方法论
面试
  • openJdk-docs
  • spring-projects-docs
  • mysql-docs
  • redis-commands
  • redis-projects
  • apache-rocketmq
  • docker-docs
  • mybatis-docs
  • netty-docs
  • journaldev
  • geeksforgeeks
  • 后端进阶
  • 并发编程网
  • 英语肌肉记忆锻炼软件
  • 墨菲安全
  • Redisson-docs
  • jmh-Visual
  • 美团技术
  • MavenSearch
主页
博客
产品设计
企业架构
全栈开发
效率工具
数据分析
项目管理
方法论
面试
  • openJdk-docs
  • spring-projects-docs
  • mysql-docs
  • redis-commands
  • redis-projects
  • apache-rocketmq
  • docker-docs
  • mybatis-docs
  • netty-docs
  • journaldev
  • geeksforgeeks
  • 后端进阶
  • 并发编程网
  • 英语肌肉记忆锻炼软件
  • 墨菲安全
  • Redisson-docs
  • jmh-Visual
  • 美团技术
  • MavenSearch
  • 标签索引
  • 2024年

    • 配置Mac环境
    • 业务知识会计管理
    • 业务知识会计基础
    • 业务知识什么是财务
  • 2023年

    • 项目 Boi
  • 2022年

    • 企业架构故障管理
    • 企业架构开发债务
  • 2021年

    • Python3.8 Matplotlib员工数据分析
    • Python3.8 Matplotlib IP折线图
    • Python3.8 词云 IP地址
    • Redis RediSearch
    • Rust第一个CLI程序
    • Rust所有权
    • Rust函数与控制流
    • Rust变量与数据类型
    • Rust入门
    • 企业架构分布式系统
    • 编程式权限设计
    • Java JVM优化
    • SpringBoot MyBatis 批量
    • SpringBoot 测试Mock
    • SpringBoot Redis布隆过滤器
    • CentOS7 Jenkins 部署
    • SpringBoot WebClient
    • Docker Drone 部署
    • SpringBoot MyBatis
    • SpringBoot Redisson
    • SpringBoot MyBatis 雪花算法
    • Java Netty
    • Redis 扫描
    • CentOS7 Jenkins本地部署分级
    • Mac 安装 Neo4j Jupyter
    • Mac OpenJDK11 JavaFX 环境
    • Mac 安装 Jenv
    • SpringBoot Redis 延时队列
    • SpringBoot MDC日志
    • SpringBoot 定时任务
    • CentOS7 Nginx GoAccess
    • SpringBoot MyBatis 分析
    • SpringBoot Lucene
    • 企业架构分布式锁
    • 学习技巧减少学习排斥心理
    • SpringBoot 动态数据源
    • Docker Compose SpringBoot MySQL Redis
    • SpringBoot 阻塞队列
    • Docker Compose Redis 哨兵
    • Docker Compose Redis 主从
    • 网络通信
  • 2020年

    • SpringBoot 延时队列
    • MySQL基础(四)
    • Java 雪花算法
    • Redis Geo
    • 网络通信 Tcpdump
    • Spring SPI
    • Java Zookeeper
    • SpringBoot JMH
    • 网络通信 Wireshark
    • Docker Compose Redis MySQL
    • CentOS7 Docker 部署
    • Netty 源码环境搭建
    • MySQL基础(三)
    • CentOS7 Selenium运行环境
    • CentOS7 Nginx HTTPS
    • Java JMH
    • SpringBoot 修改Tomcat版本
    • Java Eureka 钉钉通知
    • SpringBoot 错误钉钉通知
    • Java JVM
    • Git 合并提交
    • CentOS7 OpenResty 部署
  • 2019年

    • Redis CLI
    • CentOS7 Nginx 日志
    • 编程式代码风格
    • IDEA 插件
    • Skywalking 源码环境搭建
    • SpringBoot Redis 超时错误
    • 编程式 gRPC
    • Java Arthas
    • Docker Compose Redis 缓存击穿
    • Docker ElasticSearch5.6.8 部署
    • Docker Mysql5.7 部署
    • Spring Redis 字符串
    • Docker Zookeeper 部署
    • Docker Redis 部署
    • SpringBoot Dubbo
    • CentOS7 CMake 部署
    • 应用程序性能指标
    • Java Code 递归
    • CentOS7 ELK 部署
    • CentOS7 Sonarqube 部署
    • Java Selenium
    • Java JJWT JUnit4
    • Spring 源码环境搭建
    • Java JUnit4
    • Java Web JSON Token
    • 编程式 FastDFS
    • Java XPath
    • Redis基础(二)
    • Redis基础(一)
    • Java MyBatis JUnit4
    • Java MyBatis H2 JUnit4
    • MyBatis 源码环境搭建
    • Git 配置
    • Java 核心
    • Java Dubbo
    • Java JavaCollecionsFramework
    • Java Maven
    • Java MyBatis
    • Java Spring
    • Java SpringMVC
    • MySQL
    • Redis
  • 2018年

    • Java HashMap
    • Java HashSet
    • Java Code 交换值
    • Spring Upgrade SpringBoot
    • Mac 编程环境
    • Java Log4j
    • 网络通信 Modbus
    • MySQL基础(二)
    • MySQL基础(一)
    • Java Stack
    • Java Vector
    • CentOS7 RabbitMQ 部署
    • CentOS7 Redis 部署
    • CentOS7 MongoDB 部署
    • CentOS7 基础命令
    • Java Eureka Zookeeper
    • CentOS7 MySQL 部署
    • Git 分支
    • CentOS7 Java环境配置
    • Java LinkedList
    • Java ArrayList
    • Spring Annotation Aop

Spring Upgrade SpringBoot

2018年在公司负责了一段时间老项目改造升级工作。因此记录下折腾的过程。

  • Spring boot 最近挺火的,之前的工作并没有机会去实战。但是即使不使用Spring boot 也是可以做零配置的。

约定大于配置

  • servlet3.*的规范已经支持不使用web.xml了。
  • annotation的配置方式在Spring其实也存在很久了。

直奔主题

代码配置web.xml

org.springframework.web.WebApplicationInitializer
  • 实现这个接口,Override onStartup方法,就拿到钥匙了。
package cn.z201.learn.config;


import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.DispatcherServlet;

import cn.z201.learn.config.app.WebAppConfig;

/**
 * 基于代码可以不使用web.xml
 * @author z201
 */
public class WebProjectConfigInitializer  implements WebApplicationInitializer {
	
	public static final String CHARACTER_ENCODING = "UTF-8";
	
	private final static String DISPATCHER_SERVLET_NAME = "dispatcher";
	
	private final static String DISPATCHER_SERVLET_MAPPING = "/";

	private final static String ENCODEING_FILTER_NAME = "encodefilter";
	
	private final static String ENCODEING_FILTER_MAPPING = "/*";

	@Override
	public void onStartup(ServletContext servletContext) throws ServletException {
		initializeSpringMVCConfig(servletContext); //启动spring mvc
	}
	
	/**
	 * 注册spring mvc
	 * @param container
	 */
	private void initializeSpringMVCConfig(ServletContext container) throws ServletException {
		
		// 编码过滤器
		CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
		encodingFilter.setForceEncoding(true);
		encodingFilter.setEncoding(CHARACTER_ENCODING);
		//配置Spring提供的字符编码过滤器
		//第一个参数 指定字符编码编码
		//第二个参数 是否强制要求响应包编码与请求包相同,false表示如果响应包设置了自己编码则不强制修改
        FilterRegistration.Dynamic filter = container.addFilter(ENCODEING_FILTER_NAME, encodingFilter);
        // 解决HTTP PUT请求Spring无法获取请求参数的问题
        						   filter = container.addFilter("hiddenHttpMethodFilter", new HiddenHttpMethodFilter());
        //配置过滤器的过滤路径
        filter.addMappingForUrlPatterns(null, true, ENCODEING_FILTER_MAPPING);
		
		// Create the spring rest servlet's Spring application context
		AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
		dispatcherContext.register(WebAppConfig.class);
		// Register and map the spring rest servlet
		ServletRegistration.Dynamic dispatcher = container.addServlet(DISPATCHER_SERVLET_NAME,
				new DispatcherServlet(dispatcherContext));
		//启动顺序
		dispatcher.setLoadOnStartup(1);
		dispatcher.setAsyncSupported(true);
		//配置映射路径
		dispatcher.addMapping(DISPATCHER_SERVLET_MAPPING);
	}

}

解决Maven War提示找不到web.xml编译错误。

  • 注意如果你是Mavan项目,默认情况下war项目是需要找到web.xml的。
           <plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.4</version>
				<configuration>
				    <!-- failOnMissingWebXml false 可以没有web.xml -->
					<failOnMissingWebXml>false</failOnMissingWebXml>
					<!-- 暂时不适用其他模板页面
 					<overlays>
						<overlay>
							<groupId>org.cn.z201.views</groupId>
							<artifactId>ssh-views</artifactId>
						</overlay>
					</overlays>
					-->
				</configuration> 
			</plugin>
  • 诺,在war打包插件中配置下就好了。

主角WebAppConfig SpringMVC配置启动类。

org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
  • 继承这个类,里面有很多方法给你重写。这其实跟xml配置非常相似了。
package cn.z201.learn.config.app;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
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 org.springframework.web.servlet.i18n.LocaleChangeInterceptor;

import cn.z201.learn.config.app.support.BeetlConfiguration;
import cn.z201.learn.config.app.support.DataSourceConfiguration;
import cn.z201.learn.config.app.support.EhCacheConfiguration;
import cn.z201.learn.config.app.support.MultipartResolverConfiguration;
import cn.z201.learn.config.app.support.SchedulingConfiguration;
import cn.z201.learn.config.app.support.SwaggerConfiguration;
import cn.z201.learn.config.app.support.ValidatorConfiguration;
import cn.z201.learn.core.interceptor.LoginInterceptor;

import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 *  @Configuration,用于表示这个类是一个配置类,用于配置Spring的相关信息  
 * 		类似于spring配置文件,负责注册bean,对应的提供了@Bean注解。
 * 		需要org.springframework.web.context.support.AnnotationConfigWebApplicationContext注册到容器中。
 *  @EnableWebMvc 启用MVC Java配置(@Controller等各种注解)
 *  @ComponentScan : 注解类查找规则定义 <context:component-scan/> 组件扫描,
 * 		在basePackages指定的目录下扫描被@Controller、@Service、@Component等注解注册的组件
 *  @EnableAsync 注解的意思是可以异步执行,就是开启多线程的意思。
 *	@EnableAspectJAutoProxy,启用切面自动代理,用于AOP 激活Aspect自动代理 <aop:aspectj-autoproxy/>
 *  @EnableCaching :启用缓存注解  <cache:annotation-driven/>
 *  @EnableScheduling 启动定时任务注解
 *  @EnableTransactionManagement : 启用注解式事务管理 <tx:annotation-driven /> 启用注解事务,即可以使用@Transactional注解来控制事务
 *  @EnableWebMvcSecurity : 启用springSecurity安全验证
 *	@Import、 @ImportResource 引入指定的配置类,我们引入了Spring容器配置类和数据源事务配置类
 *	@PropertySource,加载指定的配置文件,配置文件内容会加载入Environment中等待调用
 */

@Configuration
@EnableWebMvc
@EnableAsync
@EnableScheduling
@EnableTransactionManagement
@EnableAspectJAutoProxy(proxyTargetClass = true)
@Import( { DataSourceConfiguration.class ,
	       BeetlConfiguration.class,
		   MultipartResolverConfiguration.class,
		   SwaggerConfiguration.class ,
		   EhCacheConfiguration.class ,
		   SchedulingConfiguration.class,
		   ValidatorConfiguration.class})
@PropertySource(value = {"classpath:config.properties"},ignoreResourceNotFound = true)
@ComponentScan(basePackages = { "cn.z201" })
public class WebAppConfig extends WebMvcConfigurerAdapter {
	
	private static final Logger  LOGGER = LogManager.getLogger(WebAppConfig.class);
	
	
	public WebAppConfig() {
		LOGGER.info("[Initialize WebAppConfig]");
	    Locale.setDefault(Locale.US);
	}
	
	/**
	 *  静态资源映射
	 * addResourceHandler()方法指定url,该url后连接静态文件,对应着addResourceLoaction()方法目录所对应的静态文件
	 */
	@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
		super.addResourceHandlers(registry);
    	LOGGER.info("[Initialize addResourceHandlers]");
    	registry.addResourceHandler("/static/**")
    			.addResourceLocations("/static/")
    			.setCachePeriod(5000);
    }
	
	/**
     * 将对于静态资源的请求转发到Servlet容器的默认处理静态资源的servlet
     * 因为将spring的拦截模式设置为"/"时会对静态资源进行拦截
     */
	@Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
	
	/**
	 * 添加拦截器
	 */
	@Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 多个拦截器组成一个拦截器链
        // addPathPatterns 用于添加拦截规则
        // excludePathPatterns 用户排除拦截
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/login");
        super.addInterceptors(registry);
    }
	
	
	/**
	 * 本地国际化
	 * @return
	 */
	@Bean
	public LocaleChangeInterceptor localeChangeInterceptor() {
		LOGGER.info("[Initialize LocaleChangeInterceptor]");
		return new LocaleChangeInterceptor();
	}

    /**
     * json、Jsonp消息转换适配器,用于支持RequestBody、ResponseBody
     * Json、Jsonp Message Converter , Support For RequestBody、ResponseBody
     * @return
     */
    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    	LOGGER.info("[Initialize MappingJackson2HttpMessageConverter]");
    	MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
	    	List<MediaType> mediaType = new ArrayList<MediaType>();
	    	mediaType.add(MediaType.APPLICATION_JSON_UTF8);
	    	mappingJackson2HttpMessageConverter.setSupportedMediaTypes(mediaType);
    	return mappingJackson2HttpMessageConverter;
    }
    
} 
  • 恩,我这里的其他配置是使用其他的Bean单独配置的。一个一个来吧。

其他配置

1. DataSourceConfiguration 数据源 没有使用ORM框架直接用jdbcTemplate
package cn.z201.learn.config.app.support;

import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import com.alibaba.druid.pool.DruidDataSource;


@Configuration
public class DataSourceConfiguration {
	
	private static final Logger  LOGGER = LogManager.getLogger(DataSourceConfiguration.class);
	
	@Value("${db.url}")
	private String url;
	
	@Value("${db.username}")
	private String username;
	
	@Value("${db.password}")
	private String password;
	
	@Value("${db.maxActive}")
	private int maxActive;
	
	@Value("${db.initialSize}")
    private Integer initialSize;

	@Value("${db.minIdle}")
    private Integer minIdle;

	@Value("${db.maxWait}")
    private Integer maxWait;

	@Value("${db.timeBetweenEvictionRunsMillis}")
    private Integer timeBetweenEvictionRunsMillis;

	@Value("${db.minEvictableIdleTimeMillis}")
    private Integer minEvictableIdleTimeMillis;

	@Value("${db.validationQuery}")
    private String validationQuery;

	@Value("${db.testWhileIdle}")
    private Boolean testWhileIdle;

	@Value("${db.testOnBorrow}")
    private Boolean testOnBorrow;

	@Value("${db.testOnReturn}")
    private Boolean testOnReturn;

	@Value("${db.poolPreparedStatements}")
    private Boolean poolPreparedStatements;

	@Value("${db.maxPoolPreparedStatementPerConnectionSize}")
    private Integer maxPoolPreparedStatementPerConnectionSize;

	@Value("${db.filters}")
    private String filters;
	
	 /**
     * 事务管理器
     */
    @Bean
    public DataSourceTransactionManager dataSourceTransactionManager() {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource());
        return dataSourceTransactionManager;
    }
	
	/**
     * SpringJDBC Template
    */
    @Bean
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource());
    } 
    
	@Bean
    public DataSource dataSource(){
		LOGGER.info("[Initialize DataSourceConfiguration]");
    	DruidDataSource dataSource = new DruidDataSource();
    	dataSource.setUsername(this.username);
    	dataSource.setPassword(this.password);
    	dataSource.setUrl(this.url);

        dataSource.setInitialSize(initialSize);     //定义初始连接数
        dataSource.setMinIdle(minIdle);             //最小空闲
        dataSource.setMaxActive(maxActive);         //定义最大连接数
        dataSource.setMaxWait(maxWait);             //最长等待时间

        // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);

        // 配置一个连接在池中最小生存的时间,单位是毫秒
        dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        // 用来检测连接是否有效的sql,要求是一个查询语句。 如果validationQuery为null,testOnBorrow、testOnReturn、 
		// testWhileIdle都不会其作用。在mysql中通常为select 'x',在oracle中通常为 select 1 from dual -->
        dataSource.setValidationQuery(validationQuery);
        
        // 建议配置为true,不影响性能,并且保证安全性。 申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis, 
		// 执行validationQuery检测连接是否有效。
        dataSource.setTestWhileIdle(testWhileIdle);
        // 申请连接时执行validationQuery检测连接是否有效, 做了这个配置会降低性能。
        dataSource.setTestOnBorrow(testOnBorrow);
        //归还连接时执行validationQuery检测连接是否有效, 做了这个配置会降低性能
        dataSource.setTestOnReturn(testOnReturn); 

    	// 是否缓存preparedStatement,也就是PSCache。 PSCache对支持游标的数据库性能提升巨大,比如说oracle。 
		//在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。 5.5及以上版本有PSCache,建议开启。
        dataSource.setPoolPreparedStatements(poolPreparedStatements);
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
        try {
            dataSource.setFilters(filters);
        } catch (SQLException e) {
        	LOGGER.error("[Error DataSourceConfiguration ] {}",e.getSQLState());
        }
    	return dataSource;
    }

}
2. BeetlConfiguration 页面模板引擎
package cn.z201.learn.config.app.support;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.beetl.ext.spring.BeetlGroupUtilConfiguration;
import org.beetl.ext.spring.BeetlSpringViewResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;


@Configuration
public class BeetlConfiguration{
	
	private static final Logger  LOGGER = LogManager.getLogger(BeetlConfiguration.class);
	
    /**
-	 * 配置试图模板引擎 
-	 */
	@Bean(initMethod = "init", name = "beetlConfig")
    public BeetlGroupUtilConfiguration beetlConfig() {
		LOGGER.info("[Initialize BeetlGroupUtilConfiguration]");
        BeetlGroupUtilConfiguration beetlGroupUtilConfiguration = new BeetlGroupUtilConfiguration();
        // 如果需要配置 beetl 相关功能,就传入beetl的配置文件
        // 模板的位置就在 beetl.properties 中配置
        beetlGroupUtilConfiguration.setConfigFileResource(new ClassPathResource("beetl.properties"));
        // 或简单的方式就是使用默认配置文件,用下面的代码设置模板位置
        beetlGroupUtilConfiguration.setRoot("/");
        return beetlGroupUtilConfiguration;
    }
    
	@Bean(name = "beetlSpringViewResolver")
    public BeetlSpringViewResolver beetlViewResolver(BeetlGroupUtilConfiguration beetlConfig) {
        BeetlSpringViewResolver beetlSpringViewResolver = new BeetlSpringViewResolver();
	       beetlSpringViewResolver.setContentType("text/html;charset=UTF-8"); // 设置编码
	       beetlSpringViewResolver.setOrder(0);
	       beetlSpringViewResolver.setSuffix(".html");
	       beetlSpringViewResolver.setConfig(beetlConfig);
       return beetlSpringViewResolver;
    }

}

3. MultipartResolverConfiguration 上传插件
package cn.z201.learn.config.app.support;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

@Configuration
public class MultipartResolverConfiguration {
	
	private static final Logger  LOGGER = LogManager.getLogger(MultipartResolverConfiguration.class);
	
    @Bean(name="multipartResolver")  
    public CommonsMultipartResolver commonsMultipartResolver(){  
    	LOGGER.info("[Initialize CommonsMultipartResolver]");
    	CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
    		commonsMultipartResolver.setDefaultEncoding("utf-8");     //<!--编码为uft-8 -->
    		commonsMultipartResolver.setMaxUploadSize(104666600);     //<!-- 设置最大上传文件大小为 -->
    		commonsMultipartResolver.setMaxInMemorySize(1046666000);  //<!-- 设置最大上传文件在内存中的大小 -->
        return commonsMultipartResolver;  
    }  

}

5 .SwaggerConfiguration API
package cn.z201.learn.config.app.support;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.google.common.collect.Sets;

import io.swagger.annotations.ApiOperation;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

	private static final Logger  LOGGER = LogManager.getLogger(SwaggerConfiguration.class);
	
	@Bean
    public Docket createApi() {
		LOGGER.info("[Initialize SwaggerConfiguration]");
        return new Docket(DocumentationType.SWAGGER_2)
        		.produces(Sets.newHashSet("application/json", "application/xml"))
                .consumes(Sets.newHashSet("application/json", "application/xml"))
                .protocols(Sets.newHashSet("http", "https"))
        		.forCodeGeneration(true)
                .apiInfo(apiInfo()) 
                .select()               // 选择那些路径和api会生成document
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))  //扫描注解
//                .apis(RequestHandlerSelectors.basePackage(ApiPackage.class.getPackage().getName().trim())) //扫描包路
                .paths(PathSelectors.any()) // 对所有路径进行监控
                .build();
    }
	
    private ApiInfo apiInfo() {
    	ApiInfo apiInfo= new ApiInfoBuilder()
    			 .title("API管理")
                 .description("https://my.oschina.net/z201/blog")
                 .termsOfServiceUrl("https://my.oschina.net/z201/blog")
                 .contact(new Contact("自己动手丰衣足食","","https://my.oschina.net/z201/blog"))
                 .version("1.0")
                 .build();
    	return apiInfo;
    }
}

6. EhCacheConfiguration 缓存配置
package cn.z201.learn.config.app.support;

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;

import net.sf.ehcache.CacheManager;



@Configuration
@EnableCaching
public class EhCacheConfiguration {
	
	/**
     * EhCache的配置
     */
    @Bean
    public EhCacheCacheManager cacheManager(CacheManager cacheManager) {
        return new EhCacheCacheManager(cacheManager);
    }

    /**
     * EhCache的配置
     */
    @Bean
    public EhCacheManagerFactoryBean ehcache() {
        EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
        ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
        return ehCacheManagerFactoryBean;
    }

}

7 . SchedulingConfiguration 启动定时任务 Spring task
package cn.z201.learn.config.app.support;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

@Configuration
public class SchedulingConfiguration implements SchedulingConfigurer{
	
	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		taskRegistrar.setScheduler(taskExecutor());		
	}
	
	@Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(10);
    }

}

8 . ValidatorConfiguration 验证框架配置
package cn.z201.learn.config.app.support;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

@Configuration
public class ValidatorConfiguration {
	
	private static final Logger  LOGGER = LogManager.getLogger(ValidatorConfiguration.class);
	   /**
     * 支持校验 HibernateValidator
     * @return ValidatorConfiguration
     */
    @Bean("validator")
    public LocalValidatorFactoryBean localValidatorFactoryBean(){
    	LOGGER.info("[Initialize ValidatorConfiguration]");
    	LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
    	localValidatorFactoryBean.setProviderClass(HibernateValidator.class);
    	localValidatorFactoryBean.setValidationMessageSource(reloadableResourceBundleMessageSource());
    	return new LocalValidatorFactoryBean();
    }
    
    @Bean("messageSource")
    public ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource(){
    	ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
    	reloadableResourceBundleMessageSource.setBasename("classpath:messages");
    	reloadableResourceBundleMessageSource.setDefaultEncoding("UTF-8");
    	reloadableResourceBundleMessageSource.setCacheSeconds(120);
    	return reloadableResourceBundleMessageSource;
    }

}

POM文件配置信息

		<properties>
		<!-- 项目框架组合版本号 -->
		<java.version>1.8</java.version>
		<javax.el-api.version>3.0.0</javax.el-api.version>
		<javax.servlet-api.version>3.1.0</javax.servlet-api.version>
		<spring.version>4.3.8.RELEASE</spring.version>
		<!-- 页面模板引擎ibeetl -->
		<com.ibeetl.version>2.7.15</com.ibeetl.version>
		<!--  org.ehcache 2.* -->
		<org.ehcache.version>2.10.2.2.21</org.ehcache.version>
		<!-- LOG框架 -->
		<org.log4j2.version>2.8.1</org.log4j2.version>
		<!-- org.hibernate.validator -->
		<org.hibernate-validator.version>5.2.4.Final</org.hibernate-validator.version>
		<!-- jackson框架 组合-->
		<com.fasterxml.jackson.version>2.8.1</com.fasterxml.jackson.version>
		<net.sf.json-lib.version>2.4</net.sf.json-lib.version>
		<!-- MYSQL 数据库驱动 -->
		<mysql.driver.version>5.1.28</mysql.driver.version>
		<!-- springfox-swagger -->
		<springfox.swagger.version>2.7.0</springfox.swagger.version>
		<!-- 阿里巴巴 Druid连接 -->
		<alibaba.druid.version>1.0.31</alibaba.druid.version>
		<!-- AOP 组合-->
		<org.aspectj.version>1.8.8</org.aspectj.version>
		<cglib.nodep.version>3.1</cglib.nodep.version>
		<!-- 上传组件 -->
		<apache.commons.fileupload>1.3.1</apache.commons.fileupload>
		<!--  lang3-->
		<apache.commons.lang3>3.4</apache.commons.lang3>
		<!--  io-->
		<apache.commons.io>2.4</apache.commons.io>
		<!--  collections-->
		<apache.commons.collections>3.2.1</apache.commons.collections>
		<!-- lombok 语法糖 -->
		<projectlombok.version>1.16.16</projectlombok.version>
		<!-- 单元测试 -->
		<junit.version>4.12</junit.version>
		<!-- 指定Maven编译项目编译格式 -->
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>	
	<dependencies>
			<dependency>
			<groupId>cn.z201.web.common</groupId>
			<artifactId>web.common </artifactId>
			<version>${project.version}</version>
		</dependency>
		<!-- Spring 4.* -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
			<exclusions>
				<!-- 排除通用日志 改支持SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
			<exclusions>
				<!-- 排除通用日志 改支持SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			    <groupId>org.springframework</groupId> 
				<artifactId>spring-webmvc</artifactId>
				<version>${spring.version}</version>
		</dependency>
		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
	
		<!-- hibernate validator -->
		<dependency>  
		    <groupId>org.hibernate</groupId>  
		    <artifactId>hibernate-validator</artifactId>  
		    <version>${org.hibernate-validator.version}</version>  
		</dependency> 
		<!-- 增强 AOP -->
		<!-- quartz配置 --> 
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>${org.quartz.version}</version>
			<exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>c3p0</groupId>
                    <artifactId>c3p0</artifactId>
                </exclusion>
            </exclusions>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>${org.aspectj.version}</version>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj.version}</version>
		</dependency>
		<!-- 待定 -->
		<dependency>
			<groupId>cglib</groupId>
			<artifactId>cglib-nodep</artifactId>
			<version>${cglib.nodep.version}</version>
		</dependency>
		<!-- AOP end-->
		<!-- ibeetl -->
		<dependency>
            	<groupId>com.ibeetl</groupId>
            	<artifactId>beetl</artifactId>
            	<version>${com.ibeetl.version}</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.ehcache/ehcache -->
		<dependency>
		    <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
		    <version>${org.ehcache.version}</version>
		</dependency>
		<!-- Druid -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>${alibaba.druid.version}</version>
		</dependency>
		<!-- mysql driver -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.driver.version}</version>
		</dependency>
		<!-- 添加Swagger2依赖  ${springfox.swagger.version}-->
		<dependency>  
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>${springfox.swagger.version}</version>
		</dependency> 
		<!--
		<dependency>  
			    <groupId>io.springfox</groupId>
			    <artifactId>springfox-swagger-ui</artifactId>
			    <version>2.7.0</version>
	    </dependency>
		-->
		<dependency>
		 	<groupId>com.drore.cloud</groupId>
		 	<artifactId>swagger-bootstrap-ui</artifactId>
		 	<version>1.0</version>
		</dependency> 
		<!-- Logging配置:Log4j2 -->
		<!-- log4j2 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
			<version>${org.log4j2.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>${org.log4j2.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-jcl</artifactId>
			<version>${org.log4j2.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-1.2-api</artifactId>
			<version>${org.log4j2.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-slf4j-impl</artifactId>
			<version>${org.log4j2.version}</version>
		</dependency>
		<dependency>
             <groupId>org.apache.logging.log4j</groupId>
             <artifactId>log4j-web</artifactId>
             <version>${org.log4j2.version}</version>
       	</dependency>
		<!-- 待定 -->
		<dependency>
			<groupId>cglib</groupId>
			<artifactId>cglib-nodep</artifactId>
			<version>${cglib.nodep.version}</version>
		</dependency>
		<!-- 使用jsonLayout必须依赖jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${com.fasterxml.jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${com.fasterxml.jackson.version}</version>
        </dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.jaxrs</groupId>
			<artifactId>jackson-jaxrs-json-provider</artifactId>
			<version>${com.fasterxml.jackson.version}</version>
		</dependency>
		<!--json-lib -->
		<dependency>
			<groupId>net.sf.json-lib</groupId>
			<artifactId>json-lib</artifactId>
			<version>${net.sf.json-lib.version}</version>
			<classifier>jdk15</classifier>
		</dependency>
		<!-- Test 单元测试 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
		</dependency>
		<!-- 上传 -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>${apache.commons.fileupload}</version>
		</dependency>
		<!-- H2 driver
		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<version>${h2.database.version}</version>
		</dependency>
		 --> 
		<!-- commons -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>${apache.commons.lang3}</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>${apache.commons.io}</version>
		</dependency>
		<dependency>
			<groupId>commons-collections</groupId>
			<artifactId>commons-collections</artifactId>
			<version>${apache.commons.collections}</version>
		</dependency>
		<!-- http://projectlombok.org/  -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>${projectlombok.version}</version>
		</dependency>
		<!-- WAR相关jar -->
		<!-- javax -->
		<!-- https://mvnrepository.com/artifact/javax.el/javax.el-api -->
		<dependency>
		    <groupId>javax.el</groupId>
		    <artifactId>javax.el-api</artifactId>
		    <version>${javax.el-api.version}</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>${javax.servlet-api.version}</version>
		</dependency>
        
	</dependencies>

结束语

自己动手丰衣足食

最近更新: 2025/12/27 18:51
Contributors: 庆峰
Prev
Java Code 交换值
Next
Mac 编程环境