以下的配置均可参考SSM配置内容做比较
一、Service配置
【注】@Configuration 标明这个是spring容器的配置
@EnableTransactionManagement 开启事务支持
在Service方法上添加注解 @Transactional 便可
package com.imooc.o2o.config.service;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
/**
* 对标spring-service里面的transactionManager
* 继承TransactionManagementConfigurer是因为开启annotation-driven
*
* @author xiangze
*
*/
@Configuration
// 首先使用注解 @EnableTransactionManagement 开启事务支持后
// 在Service方法上添加注解 @Transactional 便可
@EnableTransactionManagement
public class TransactionManagementConfiguration implements TransactionManagementConfigurer {
@Autowired
// 注入DataSourceConfiguration里边的dataSource,通过createDataSource()获取
private DataSource dataSource;
@Override
/**
* 关于事务管理,需要返回PlatformTransactionManager的实现
*/
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new DataSourceTransactionManager(dataSource);
}
}
二、Redis配置
application.properties
#Redis配置
redis.hostname=127.0.0.1
redis.port=6379
redis.pool.maxActive=100
redis.pool.maxIdle=20
redis.pool.maxWait=3000
redis.pool.testOnBorrow=true
JedisUtil
package com.imooc.o2o.cache;
import java.util.Set;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.util.SafeEncoder;
public class JedisUtil {
/**
* 缓存生存时间
*/
private final int expire = 60000;
/** 操作Key的方法 */
public Keys KEYS;
/** 对存储结构为String类型的操作 */
public Strings STRINGS;
/** Redis连接池对象 */
private JedisPool jedisPool;
/**
* 获取redis连接池
*
* @return
*/
public JedisPool getJedisPool() {
return jedisPool;
}
/**
* 设置redis连接池
*
* @return
*/
public void setJedisPool(JedisPoolWriper jedisPoolWriper) {
this.jedisPool = jedisPoolWriper.getJedisPool();
}
/**
* 从jedis连接池中获取获取jedis对象
*
* @return
*/
public Jedis getJedis() {
return jedisPool.getResource();
}
// *******************************************Keys*******************************************//
public class Keys {
/**
* 清空所有key
*/
public String flushAll() {
Jedis jedis = getJedis();
String stata = jedis.flushAll();
jedis.close();
return stata;
}
/**
* 删除keys对应的记录,可以是多个key
*
* @param String
* ... keys
* @return 删除的记录数
*/
public long del(String... keys) {
Jedis jedis = getJedis();
long count = jedis.del(keys);
jedis.close();
return count;
}
/**
* 判断key是否存在
*
* @param String
* key
* @return boolean
*/
public boolean exists(String key) {
// ShardedJedis sjedis = getShardedJedis();
Jedis sjedis = getJedis();
boolean exis = sjedis.exists(key);
sjedis.close();
return exis;
}
/**
* 查找所有匹配给定的模式的键
*
* @param String
* key的表达式,*表示多个,?表示一个
*/
public Set<String> keys(String pattern) {
Jedis jedis = getJedis();
Set<String> set = jedis.keys(pattern);
jedis.close();
return set;
}
}
// *******************************************Strings*******************************************//
public class Strings {
/**
* 根据key获取记录
*
* @param String
* key
* @return 值
*/
public String get(String key) {
// ShardedJedis sjedis = getShardedJedis();
Jedis sjedis = getJedis();
String value = sjedis.get(key);
sjedis.close();
return value;
}
/**
* 添加记录,如果记录已存在将覆盖原有的value
*
* @param String
* key
* @param String
* value
* @return 状态码
*/
public String set(String key, String value) {
return set(SafeEncoder.encode(key), SafeEncoder.encode(value));
}
/**
* 添加记录,如果记录已存在将覆盖原有的value
*
* @param byte[]
* key
* @param byte[]
* value
* @return 状态码
*/
public String set(byte[] key, byte[] value) {
Jedis jedis = getJedis();
String status = jedis.set(key, value);
jedis.close();
return status;
}
}
}
JedisPoolWriper
package com.imooc.o2o.cache;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* 强指定redis的JedisPool接口构造函数,这样才能在centos成功创建jedispool
*
* @author xiangze
*
*/
public class JedisPoolWriper {
/** Redis连接池对象 */
private JedisPool jedisPool;
public JedisPoolWriper(final JedisPoolConfig poolConfig, final String host,
final int port) {
try {
jedisPool = new JedisPool(poolConfig, host, port);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取Redis连接池对象
* @return
*/
public JedisPool getJedisPool() {
return jedisPool;
}
/**
* 注入Redis连接池对象
* @param jedisPool
*/
public void setJedisPool(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
}
RedisConfiguration
package com.imooc.o2o.config.redis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.imooc.o2o.cache.JedisPoolWriper;
import com.imooc.o2o.cache.JedisUtil;
import redis.clients.jedis.JedisPoolConfig;
/**
* spring-redis.xml里的配置
*
* @author
*
*/
@Configuration
public class RedisConfiguration {
@Value("${redis.hostname}")
private String hostname;
@Value("${redis.port}")
private int port;
@Value("${redis.pool.maxActive}")
private int maxTotal;
@Value("${redis.pool.maxIdle}")
private int maxIdle;
@Value("${redis.pool.maxWait}")
private long maxWaitMillis;
@Value("${redis.pool.testOnBorrow}")
private boolean testOnBorrow;
@Autowired
private JedisPoolConfig jedisPoolConfig;
@Autowired
private JedisPoolWriper jedisWritePool;
@Autowired
private JedisUtil jedisUtil;
/**
* 创建redis连接池的设置
*
* @return
*/
@Bean(name = "jedisPoolConfig")
public JedisPoolConfig createJedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 控制一个pool可分配多少个jedis实例
jedisPoolConfig.setMaxTotal(maxTotal);
// 连接池中最多可空闲maxIdle个连接 ,这里取值为20,
// 表示即使没有数据库连接时依然可以保持20空闲的连接,
// 而不被清除,随时处于待命状态。
jedisPoolConfig.setMaxIdle(maxIdle);
// 最大等待时间:当没有可用连接时,
// 连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
// 在获取连接的时候检查有效性
jedisPoolConfig.setTestOnBorrow(testOnBorrow);
return jedisPoolConfig;
}
/**
* 创建Redis连接池,并做相关配置
*
* @return
*/
@Bean(name = "jedisWritePool")
public JedisPoolWriper createJedisPoolWriper() {
JedisPoolWriper jedisPoolWriper = new JedisPoolWriper(jedisPoolConfig, hostname, port);
return jedisPoolWriper;
}
/**
* 创建Redis工具类,封装好Redis的连接以进行相关的操作
*
* @return
*/
@Bean(name = "jedisUtil")
public JedisUtil createJedisUtil() {
JedisUtil jedisUtil = new JedisUtil();
jedisUtil.setJedisPool(jedisWritePool);
return jedisUtil;
}
/**
* Redis的key操作
*
* @return
*/
@Bean(name = "jedisKeys")
public JedisUtil.Keys createJedisKeys() {
JedisUtil.Keys jedisKeys = jedisUtil.new Keys();
return jedisKeys;
}
/**
* Redis的Strings操作
*
* @return
*/
@Bean(name = "jedisStrings")
public JedisUtil.Strings createJedisStrings() {
JedisUtil.Strings jedisStrings = jedisUtil.new Strings();
return jedisStrings;
}
}
三、web配置(视图解析器、拦截器)
1、配置
package com.imooc.o2o.config.web;
import javax.servlet.ServletException;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import com.google.code.kaptcha.servlet.KaptchaServlet;
import com.imooc.o2o.interceptor.shopadmin.ShopLoginInterceptor;
import com.imooc.o2o.interceptor.shopadmin.ShopPermissionInterceptor;
import com.imooc.o2o.interceptor.superadmin.SuperAdminLoginInterceptor;
/**
* 开启Mvc,自动注入spring容器。 WebMvcConfigurerAdapter:配置视图解析器
* 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean
*
* @author kasey
*
*/
@Configuration
// 等价于<mvc:annotation-driven/>
@EnableWebMvc
public class MvcConfiguration implements WebMvcConfigurer, ApplicationContextAware {
// Spring容器
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
/**
* 静态资源配置
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/");
//registry.addResourceHandler("/upload/**").addResourceLocations("file:/Users/baidu/work/image/upload");
//registry.addResourceHandler("/upload/**").addResourceLocations("file:D:\\projectdev\\image\\upload\\");
String os = System.getProperty("os.name");
if (os.toLowerCase().startsWith("win")) { //如果是Windows系统
registry.addResourceHandler("/upload/**")
// /apple/**表示在磁盘apple目录下的所有资源会被解析为以下的路径
.addResourceLocations("file:D:/projectdev/image/upload/") //媒体资源
.addResourceLocations("classpath:/META-INF/resources/"); //swagger2页面
} else { //linux 和mac
registry.addResourceHandler("/smallapple/**")
.addResourceLocations("file:/resources/smallapple/") //媒体资源
.addResourceLocations("classpath:/META-INF/resources/"); //swagger2页面;
}
}
/**
* 定义默认的请求处理器
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/**
* 创建viewResolver
*
* @return
*/
@Bean(name = "viewResolver")
public ViewResolver createViewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
// 设置Spring 容器
viewResolver.setApplicationContext(this.applicationContext);
// 取消缓存
viewResolver.setCache(false);
// 设置解析的前缀
viewResolver.setPrefix("/WEB-INF/html/");
// 设置试图解析的后缀
viewResolver.setSuffix(".html");
return viewResolver;
}
/**
* 文件上传解析器
*
* @return
*/
@Bean(name = "multipartResolver")
public CommonsMultipartResolver createMultipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setDefaultEncoding("utf-8");
// 1024 * 1024 * 20 = 20M
multipartResolver.setMaxUploadSize(20971520);
multipartResolver.setMaxInMemorySize(20971520);
return multipartResolver;
}
@Value("${kaptcha.border}")
private String border;
@Value("${kaptcha.textproducer.font.color}")
private String fcolor;
@Value("${kaptcha.image.width}")
private String width;
@Value("${kaptcha.textproducer.char.string}")
private String cString;
@Value("${kaptcha.image.height}")
private String height;
@Value("${kaptcha.textproducer.font.size}")
private String fsize;
@Value("${kaptcha.noise.color}")
private String nColor;
@Value("${kaptcha.textproducer.char.length}")
private String clength;
@Value("${kaptcha.textproducer.font.names}")
private String fnames;
/**
* 由于web.xml不生效了,需要在这里配置Kaptcha验证码Servlet
*/
@Bean
public ServletRegistrationBean<KaptchaServlet> servletRegistrationBean() throws ServletException {
ServletRegistrationBean<KaptchaServlet> servlet = new ServletRegistrationBean<KaptchaServlet>(
new KaptchaServlet(), "/Kaptcha");
servlet.addInitParameter("kaptcha.border", border);// 无边框
servlet.addInitParameter("kaptcha.textproducer.font.color", fcolor); // 字体颜色
servlet.addInitParameter("kaptcha.image.width", width);// 图片宽度
servlet.addInitParameter("kaptcha.textproducer.char.string", cString);// 使用哪些字符生成验证码
servlet.addInitParameter("kaptcha.image.height", height);// 图片高度
servlet.addInitParameter("kaptcha.textproducer.font.size", fsize);// 字体大小
servlet.addInitParameter("kaptcha.noise.color", nColor);// 干扰线的颜色
servlet.addInitParameter("kaptcha.textproducer.char.length", clength);// 字符个数
servlet.addInitParameter("kaptcha.textproducer.font.names", fnames);// 字体
return servlet;
}
/**
* 添加拦截器配置
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
/** 店家管理系统拦截部分 **/
String interceptPath = "/shopadmin/**";
// 注册拦截器
InterceptorRegistration loginIR = registry.addInterceptor(new ShopLoginInterceptor());
// 配置拦截的路径
loginIR.addPathPatterns(interceptPath);
/** shopauthmanagement page **/
loginIR.excludePathPatterns("/shopadmin/addshopauthmap");
/** scan **/
loginIR.excludePathPatterns("/shopadmin/adduserproductmap");
loginIR.excludePathPatterns("/shopadmin/exchangeaward");
// 还可以注册其它的拦截器
InterceptorRegistration permissionIR = registry.addInterceptor(new ShopPermissionInterceptor());
// 配置拦截的路径
permissionIR.addPathPatterns(interceptPath);
// 配置不拦截的路径
/** shoplist page **/
permissionIR.excludePathPatterns("/shopadmin/shoplist");
permissionIR.excludePathPatterns("/shopadmin/getshoplist");
/** shopregister page **/
permissionIR.excludePathPatterns("/shopadmin/getshopinitinfo");
permissionIR.excludePathPatterns("/shopadmin/registershop");
permissionIR.excludePathPatterns("/shopadmin/shopoperation");
/** shopmanage page **/
permissionIR.excludePathPatterns("/shopadmin/shopmanagement");
permissionIR.excludePathPatterns("/shopadmin/getshopmanagementinfo");
/** shopauthmanagement page **/
permissionIR.excludePathPatterns("/shopadmin/addshopauthmap");
/** scan **/
permissionIR.excludePathPatterns("/shopadmin/adduserproductmap");
permissionIR.excludePathPatterns("/shopadmin/exchangeaward");
/** 超级管理员系统拦截部分 **/
interceptPath = "/superadmin/**";
// 注册拦截器
InterceptorRegistration superadminloginIR = registry.addInterceptor(new SuperAdminLoginInterceptor());
// 配置拦截的路径
superadminloginIR.addPathPatterns(interceptPath);
superadminloginIR.excludePathPatterns("/superadmin/login");
superadminloginIR.excludePathPatterns("/superadmin/logincheck");
superadminloginIR.excludePathPatterns("/superadmin/main");
superadminloginIR.excludePathPatterns("/superadmin/top");
superadminloginIR.excludePathPatterns("/superadmin/clearcache4area");
superadminloginIR.excludePathPatterns("/superadmin/clearcache4headline");
superadminloginIR.excludePathPatterns("/superadmin/clearcache4shopcategory");
}
}
2、配置相关信息
#Kaptcha的配置
kaptcha.border=no
kaptcha.textproducer.font.color=red
kaptcha.image.width=135
kaptcha.textproducer.char.string=ACDEFHKPRSTWX345679
kaptcha.image.height=50
kaptcha.textproducer.font.size=43
kaptcha.noise.color=black
kaptcha.textproducer.char.length=4
kaptcha.textproducer.font.names=Arial
#Path管理
win.base.path=D:/projectdev/image
linux.base.path=/Users/baidu/work/image
shop.relevant.path=/upload/images/item/shop/
headline.relevant.path=/upload/images/item/headtitle/
shopcategory.relevant.path=/upload/images/item/shopcategory/