1. 配置類
(1) 編寫配置類
1) 簡單配置類
1. 類上加註解 @Configuration
指明當前類是一個配置類;就是來替代之前的Spring配置文件 在配置文件中用<bean><bean/>標籤添加組件
2. 方法上加註解 @Bean
將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
2)
(2) 常見配置類總結
1) jsckson工具轉換時對日期格式的處理配置
package org.demo.xudl.springboot2.config;
import java.text.SimpleDateFormat;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
@Configuration
public class CustomerConfig {
/**
* 制定jsckson工具轉換時對日期格式的處理
* @return
*/
@Bean
public ObjectMapper getObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
return mapper;
}
}
2) mvc配置類 (攔截器)
@Configuration
public class SpringWebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加攔截規則
// 只有用戶登錄過後才能訪問 user/目錄下資源
registry.addInterceptor(new UserInterceptor()).addPathPatterns("/api/user/**");
/**
* 只有登錄管理員賬號後才能訪問管理員目錄
* 例外:管理員登錄路徑 /api/admin/login
*/
registry.addInterceptor(new AdminInterceptor()).addPathPatterns("/api/admin/**")
.excludePathPatterns("/api/admin/login");
/**
* 配置靜態文件訪問路徑
*/
registry.addResourceHandler("/hystrix/**").addResourceLocations(
"classpath:/static/hystrix/");
super.addInterceptors(registry);
}
}
3) Mybatis相關配置
package com.github.wxiaoqi.security.admin.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.github.pagehelper.PageHelper;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Properties;
/**
* mybatis 配置數據源類 spring boot有默認配置
*/
@Configuration
@EnableTransactionManagement
public class MybatisConfiguration implements EnvironmentAware {
private RelaxedPropertyResolver propertyResolver;
private String driveClassName;
private String url;
private String userName;
private String password;
private String xmlLocation;
private String typeAliasesPackage;
/////////////////////druid參數///////////////////////////////////////////////////
private String filters;
private String maxActive;
private String initialSize;
private String maxWait;
private String minIdle;
private String timeBetweenEvictionRunsMillis;
private String minEvictableIdleTimeMillis;
private String validationQuery;
private String testWhileIdle;
private String testOnBorrow;
private String testOnReturn;
private String poolPreparedStatements;
private String maxOpenPreparedStatements;
//////////////////////////////////////////////////////////////////////////
@Bean
public DataSource druidDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl(url);
druidDataSource.setUsername(userName);
druidDataSource.setPassword(password);
druidDataSource.setDriverClassName(StringUtils.isNotBlank(driveClassName)?driveClassName:"com.mysql.jdbc.Driver");
druidDataSource.setMaxActive(StringUtils.isNotBlank(maxActive)? Integer.parseInt(maxActive):10);
druidDataSource.setInitialSize(StringUtils.isNotBlank(initialSize)? Integer.parseInt(initialSize):1);
druidDataSource.setMaxWait(StringUtils.isNotBlank(maxWait)? Integer.parseInt(maxWait):60000);
druidDataSource.setMinIdle(StringUtils.isNotBlank(minIdle)? Integer.parseInt(minIdle):3);
druidDataSource.setTimeBetweenEvictionRunsMillis(StringUtils.isNotBlank(timeBetweenEvictionRunsMillis)?
Integer.parseInt(timeBetweenEvictionRunsMillis):60000);
druidDataSource.setMinEvictableIdleTimeMillis(StringUtils.isNotBlank(minEvictableIdleTimeMillis)?
Integer.parseInt(minEvictableIdleTimeMillis):300000);
druidDataSource.setValidationQuery(StringUtils.isNotBlank(validationQuery)?validationQuery:"select 'x'");
druidDataSource.setTestWhileIdle(StringUtils.isNotBlank(testWhileIdle)? Boolean.parseBoolean(testWhileIdle):true);
druidDataSource.setTestOnBorrow(StringUtils.isNotBlank(testOnBorrow)? Boolean.parseBoolean(testOnBorrow):false);
druidDataSource.setTestOnReturn(StringUtils.isNotBlank(testOnReturn)? Boolean.parseBoolean(testOnReturn):false);
druidDataSource.setPoolPreparedStatements(StringUtils.isNotBlank(poolPreparedStatements)? Boolean.parseBoolean(poolPreparedStatements):true);
druidDataSource.setMaxOpenPreparedStatements(StringUtils.isNotBlank(maxOpenPreparedStatements)? Integer.parseInt(maxOpenPreparedStatements):20);
try {
druidDataSource.setFilters(StringUtils.isNotBlank(filters)?filters:"stat, wall");
} catch (SQLException e) {
e.printStackTrace();
}
return druidDataSource;
}
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
if(StringUtils.isNotBlank(typeAliasesPackage)){
bean.setTypeAliasesPackage(typeAliasesPackage);
}
//分頁插件
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("reasonable", "true");
properties.setProperty("supportMethodsArguments", "true");
properties.setProperty("returnPageInfo", "check");
properties.setProperty("params", "count=countSql");
pageHelper.setProperties(properties);
//添加XML目錄
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Interceptor[] plugins = new Interceptor[]{pageHelper};
bean.setPlugins(plugins);
try {
bean.setMapperLocations(resolver.getResources(xmlLocation));
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
//set方法,從配置文件中獲取值,可以用其他方式獲得
public void setEnvironment(Environment environment) {
this.propertyResolver = new RelaxedPropertyResolver(environment, null);
this.url = propertyResolver.getProperty("spring.datasource.url");
this.userName= propertyResolver.getProperty("spring.datasource.username");
this.password = propertyResolver.getProperty("spring.datasource.password");
this.driveClassName = propertyResolver.getProperty("spring.datasource.driver-class-name");
this.filters = propertyResolver.getProperty("spring.datasource.filters");
this.maxActive = propertyResolver.getProperty("spring.datasource.maxActive");
this.initialSize = propertyResolver.getProperty("spring.datasource.initialSize");
this.maxWait = propertyResolver.getProperty("spring.datasource.maxWait");
this.minIdle = propertyResolver.getProperty("spring.datasource.minIdle");
this.timeBetweenEvictionRunsMillis = propertyResolver.getProperty("spring.datasource.timeBetweenEvictionRunsMillis");
this.minEvictableIdleTimeMillis = propertyResolver.getProperty("spring.datasource.minEvictableIdleTimeMillis");
this.validationQuery = propertyResolver.getProperty("spring.datasource.validationQuery");
this.testWhileIdle = propertyResolver.getProperty("spring.datasource.testWhileIdle");
this.testOnBorrow = propertyResolver.getProperty("spring.datasource.testOnBorrow");
this.testOnReturn = propertyResolver.getProperty("spring.datasource.testOnReturn");
this.poolPreparedStatements = propertyResolver.getProperty("spring.datasource.poolPreparedStatements");
this.maxOpenPreparedStatements = propertyResolver.getProperty("spring.datasource.maxOpenPreparedStatements");
this.typeAliasesPackage = propertyResolver.getProperty("mybatis.typeAliasesPackage");
this.xmlLocation = propertyResolver.getProperty("mybatis.xmlLocation");
}
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
4) mapper 掃描配置類
package com.github.wxiaoqi.security.admin.config;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import tk.mybatis.spring.mapper.MapperScannerConfigurer;
/**
* mybatis mapper 掃描配置類 從配置文件中獲取mapper掃描包
*/
@Configuration
@AutoConfigureAfter(MybatisConfiguration.class)
public class MapperConfiguration implements EnvironmentAware {
private RelaxedPropertyResolver propertyResolver;
private String basePackage;
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(Environment environment){
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
mapperScannerConfigurer.setBasePackage(basePackage);
return mapperScannerConfigurer;
}
public void setEnvironment(Environment environment) {
this.propertyResolver = new RelaxedPropertyResolver(environment, null);
this.basePackage = propertyResolver.getProperty("mybatis.basepackage");
}
}
5) RedisTemplate配置
package com.github.wxiaoqi.security.auth.configuration;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
/**
*RedisTemplate配置
*/
@Configuration
@PropertySource("classpath:redis.properties")
public class RedisConfiguration {
@Autowired
private Environment environment;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
JedisConnectionFactory fac = new JedisConnectionFactory();
fac.setHostName(environment.getProperty("redis.hostName"));
fac.setPort(Integer.parseInt(environment.getProperty("redis.port")));
fac.setPassword(environment.getProperty("redis.password"));
fac.setTimeout(Integer.parseInt(environment.getProperty("redis.timeout")));
fac.getPoolConfig().setMaxIdle(Integer.parseInt(environment.getProperty("redis.maxIdle")));
fac.getPoolConfig().setMaxTotal(Integer.parseInt(environment.getProperty("redis.maxTotal")));
fac.getPoolConfig().setMaxWaitMillis(Integer.parseInt(environment.getProperty("redis.maxWaitMillis")));
fac.getPoolConfig().setMinEvictableIdleTimeMillis(
Integer.parseInt(environment.getProperty("redis.minEvictableIdleTimeMillis")));
fac.getPoolConfig()
.setNumTestsPerEvictionRun(Integer.parseInt(environment.getProperty("redis.numTestsPerEvictionRun")));
fac.getPoolConfig().setTimeBetweenEvictionRunsMillis(
Integer.parseInt(environment.getProperty("redis.timeBetweenEvictionRunsMillis")));
fac.getPoolConfig().setTestOnBorrow(Boolean.parseBoolean(environment.getProperty("redis.testOnBorrow")));
fac.getPoolConfig().setTestWhileIdle(Boolean.parseBoolean(environment.getProperty("redis.testWhileIdle")));
return fac;
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}