springboot提倡0配置文件配置,改用JavaBean配置,而刚转到springboot的人不免有些无从下手,这篇文章就介绍一下,springboot的常用JavaBean配置。
1、webmvc配置
这里webmvc配置主要是添加"过滤器","拦截器",与重写接口解析方式
@EnableWebMvc
@Configuration
public class WebMvcConfig extends WebMvcAutoConfiguration implements WebMvcConfigurer{
/**
* 指定日期接口解析方式
*/
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new DateConverter());
}
/**
* 把返回Json中的null换为""
*/
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.getSerializerProvider().setNullValueSerializer(new NullSerializer());
return objectMapper;
}
/**
* 添加拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
List patterns = new ArrayList<>();
patterns.add("/html/**");
patterns.add("/script/**");
patterns.add("/print/**");
patterns.add("/index.html");
patterns.add("/swagger-ui.html");
patterns.add("/webjars/**");
patterns.add("/swagger-resources/**");
patterns.add("/swagger-resources/**");
registry.addInterceptor(new SessionInterceptor()).excludePathPatterns(patterns);
}
/**
* 添加过滤器
*/
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
PageFilter loginFilter = new PageFilter();
registrationBean.setFilter(loginFilter);
List urlPatterns = new ArrayList();
urlPatterns.add("/login");
urlPatterns.add("*.html");
registrationBean.setUrlPatterns(urlPatterns);
return registrationBean;
}
}
2、mybatis配置
mybatis配置是通过注入的方式实现的,只需要在webmcv配置最后添加即可
/**
* mybatis配置
* @return
*/
@Bean
ConfigurationCustomizer mybatisConfig(){
return configuration -> {
// setting
configuration.setUseGeneratedKeys(true);
configuration.setCacheEnabled(true);
configuration.setLazyLoadingEnabled(true);
configuration.setAutoMappingBehavior(AutoMappingBehavior.FULL);
configuration.setAggressiveLazyLoading(true);
// typeAlias
configuration.getTypeAliasRegistry().registerAliases("com.pcbwx.jsp.bean");
};
}
3、reids配置
我这里的redis配置比较简单,主要是配置redis所用操作类Template
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
/**
* 创建redis操作实例
* @param clazz 泛型类
* @param connectionFactory redis连接工厂
* @return
*/
private RedisTemplate createTemplate(Class clazz, RedisConnectionFactory connectionFactory){
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(
clazz);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(jackson2JsonRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
// --------------------注入操作类---------------------------
@Bean
StringRedisTemplate stringTemplate(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
@Bean
RedisTemplate template(RedisConnectionFactory connectionFactory) {
return createTemplate(Object.class, connectionFactory);
}
@Bean
RedisTemplate templateDic(RedisConnectionFactory connectionFactory) {
return createTemplate(Dictionary.class, connectionFactory);
}
}
4、log4j2配置
在springboot使用log4j2,首先需要添加jar包
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-logging
org.springframework.boot
spring-boot-starter-log4j2
log4j2配置添加了线上线下环境配置,日志文件按天保存,线上环境异步输出日志。
@Plugin(name = "log4j2Config", category = ConfigurationFactory.CATEGORY)
@Order(Ordered.HIGHEST_PRECEDENCE)
@org.springframework.context.annotation.Configuration
public class Log4j2Config extends ConfigurationFactory{
private static final String INFOAPPENDER = "myInfo";
private static final String ERRORAPPENDER = "myError";
private static final String CONSOLE = "Console";
private static final String ASYNC = "ASYNC";
private static final String FILEPATH = "/opt/logs/";
private static final boolean dev = true;
private Configuration createConfiguration(final String name, ConfigurationBuilder builder) {
builder.setConfigurationName(name);
builder.setStatusLevel(Level.INFO);
if (dev) {
builder.add(getConsoleBuilder(builder));
addDevLogger(builder);
builder.add(builder.newRootLogger(Level.INFO).add(builder.newAppenderRef(CONSOLE)));
} else {
builder.add(getErrorFileBuilder(builder));
builder.add(getInfoFileBuilder(builder));
builder.add(getAsyncBuilder(builder));
builder.add(builder.newRootLogger(Level.INFO).add(builder.newAppenderRef(ASYNC)));
}
return builder.build();
}
@Override
public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
return getConfiguration(loggerContext, source.toString(), null);
}
@Override
public Configuration getConfiguration(final LoggerContext loggerContext, final String name, final URI configLocation) {
ConfigurationBuilder builder = newConfigurationBuilder();
return createConfiguration(name, builder);
}
@Override
protected String[] getSupportedTypes() {
return new String[] {"*"};
}
/**
* 获取显示台适配器
* @param builder
* @return
*/
private AppenderComponentBuilder getConsoleBuilder(
ConfigurationBuilder builder) {
AppenderComponentBuilder appenderBuilder = builder.newAppender(
CONSOLE, "Console").addAttribute("target",
ConsoleAppender.Target.SYSTEM_OUT);
appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute(
"pattern",
"%d{HH:mm:ss} %-5level %logger{36} [%L] - %msg%n"));
return appenderBuilder;
}
/**
* 获取Error文件日志适配器
* @param builder
* @return
*/
private AppenderComponentBuilder getInfoFileBuilder(
ConfigurationBuilder builder) {
AppenderComponentBuilder appenderBuilder = builder
.newAppender(INFOAPPENDER, "RollingFile")
.addAttribute("fileName", FILEPATH + "/info/info.log")
.addAttribute("filePattern", FILEPATH + "/info/info-%d{yyyy-MM-dd}.log");
appenderBuilder.add(builder.newLayout("ThresholdFilter")
.addAttribute("level", Level.INFO)
.addAttribute("onMatch", "ACCEPT")
.addAttribute("onMismatch", "DENY"));
appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute(
"pattern",
"%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} [%L] - %msg%n"));
appenderBuilder.add(builder.newLayout("Policies").addComponent(
builder.newLayout("TimeBasedTriggeringPolicy")
.addAttribute("modulate", true)
.addAttribute("interval", "1")));
return appenderBuilder;
}
/**
* 获取Info文件日志适配器
* @param builder
* @return
*/
private AppenderComponentBuilder getErrorFileBuilder(
ConfigurationBuilder builder) {
AppenderComponentBuilder appenderBuilder = builder
.newAppender(ERRORAPPENDER, "RollingFile")
.addAttribute("fileName",
FILEPATH + "/error/error.log")
.addAttribute("filePattern",
FILEPATH + "/error/error-%d{yyyy-MM-dd}.log");
appenderBuilder.add(builder.newLayout("ThresholdFilter")
.addAttribute("level", Level.ERROR)
.addAttribute("onMatch", "ACCEPT")
.addAttribute("onMismatch", "DENY"));
appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute(
"pattern",
"%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} [%L] - %msg%n"));
appenderBuilder.add(builder.newLayout("Policies").addComponent(
builder.newLayout("TimeBasedTriggeringPolicy")
.addAttribute("modulate", true)
.addAttribute("interval", "1")));
return appenderBuilder;
}
/**
* 获取异步写日志适配器
* @param builder
* @return
*/
private AppenderComponentBuilder getAsyncBuilder(
ConfigurationBuilder builder) {
AppenderComponentBuilder appenderBuilder = builder
.newAppender(ASYNC, "Async");
appenderBuilder.add(builder.newLayout("AppenderRef")
.addAttribute("ref", INFOAPPENDER));
appenderBuilder.add(builder.newLayout("AppenderRef")
.addAttribute("ref", ERRORAPPENDER));
return appenderBuilder;
}
/**
* 添加debug环境
* @param builder
*/
private void addDevLogger(ConfigurationBuilder builder){
// 添加mybatis-debug支持
LoggerComponentBuilder loggerMyBatisBuilder = builder
.newLogger("com.pcbwx.jsp.dao", Level.DEBUG)
.addAttribute("additivity", false)
.add(builder.newAppenderRef(CONSOLE));
builder.add(loggerMyBatisBuilder);
// 添加spring-debug支持
LoggerComponentBuilder loggerSpringBuilder = builder
.newLogger("org.springframework", Level.INFO)
.addAttribute("additivity", false)
.add(builder.newAppenderRef(CONSOLE));
builder.add(loggerSpringBuilder);
}
}
github: https://github.com/HeyuRise/jsp