这里结合自己从SSM框架把项目转移到Springboot的经历,谈一下SpringBoot详细的搭建过程。
在 http://start.spring.io/中 填好相关的信息
然后把项目import进来,这里用到的IDE为STS,风格和Eclipse近似。
这里与SSM框架不同的是:
1./main/resources下 有个application.properties 这里存放着全局变量
2.以往spring - xml的配置文件,现在我们直接用代码和注解实现,在主包下建一个config包,里面是用来代替xml文件的配置类
3.spring boot 自带有tomcat,启动xxxApplication.java,便能够启动项目
4.以往pom.xml的配置信息中不用再填入 spring 和mybatis相关的配置,因为开始我们已经配置过
Ok接下来我们开始dao层的配置
首先在application.properties 填好跟dataSource相关的信息
相关的配置是这样的,前面的server.port是项目默认启动的端口,context-path代表的是我们访问项目的前缀,如localhost:8080/o2o/xxx。
然后我们在config下再建一个dao层的包,里面我们建两个类DataSourceConfiguration 、 SessionFactoryConfiguration。
我们先完成DataSourceConfiguration的信息:
这里要注意一点,所有的配置文件,也就是需要在application.properties取值的文件必须加上@Configuration的注解,否则会报错。
这里我们还需要加入@MapperScan("com.elliot.o2o.dao") ,括号里面填要扫描的dao层的包名。
然后把全局变量里的值用@Value注解的形式引入进来,并且创建createDataSource方法,返回一个DataSource实体类。向下面这样:
@Value("${jdbc.driver}")
private String jdbcDriver;
@Value("${jdbc.url}")
private String jdbcUrl;
@Value("${jdbc.username}")
private String jdbcUsername;
@Value("${jdbc.password}")
private String jdbcPassword;
@Bean(name = "dataSource")
public ComboPooledDataSource createDataSource() throws PropertyVetoException{
//生成datasource 实例
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//跟配置文件一样设置以下信息
dataSource.setDriverClass(jdbcDriver);
//数据库连接Url
dataSource.setJdbcUrl(jdbcUrl);
//设置用户名
dataSource.setUser(DESUtil.getDecryptString(jdbcUsername));
//设置密码
dataSource.setPassword(DESUtil.getDecryptString(jdbcPassword));
//连接池最大线程数
dataSource.setMaxPoolSize(30);
//连接池最小线程数
dataSource.setMinPoolSize(10);
//关闭连接后不自动commit
dataSource.setAutoCommitOnClose(false);
//连接超时的时间
dataSource.setCheckoutTimeout(10000);
//连接失败的次数
dataSource.setAcquireIncrement(2);
return dataSource;
}
接下来我们配置SqlsessionFactory的SessionFactoryConfiguration的信息,这里我们需要配置一个mybatis-config.xml在resource包下。然后我们在application.properties下继续定义3个全局变量 分别是mybatis_config_file(配置文件路径)、mapper_path(所有mapper的路径)、type_alias_package(映射pojo层的包路径)。
像这样配置,接着我们开始编写SessionFactoryConfiguration。
//mybatis-config.xml配置文件路径
private static String mybatisConfigFile;
@Value("${mybatis_config_file}")
public void setMybatisConfigFile(String mybatisConfigFile) {
SessionFactoryConfiguration.mybatisConfigFile = mybatisConfigFile;
}
//mybatis mapper文件所在路径
private static String mapperPath;
@Value("${mapper_path}")
public void setMapperPath(String mapperPath) {
SessionFactoryConfiguration.mapperPath = mapperPath;
}
//实体类所在的package
@Value("${type_alias_package}")
private String typeAliasesPackage;
@Autowired
DataSource dataSource;
/**
* 创建sqlSessionFactoryBean实例
* 并且设置configuration
* 设置mapper映射路径
* @return
* @throws IOException
*/
@Bean(name="sqlSessionFactory")
public SqlSessionFactoryBean createSqlSessionFactoryBean() throws IOException{
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
//设置mybatis configuration 扫描路径
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource(mybatisConfigFile));
//添加mapper 扫描路径
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver =
new PathMatchingResourcePatternResolver();
String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + mapperPath;
sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources(packageSearchPath));
//设置DataSource
sqlSessionFactoryBean.setDataSource(dataSource);
//设置typeAlias包扫描路径
sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasesPackage);
return sqlSessionFactoryBean;
}
好了,到这里为止有关dao层配置已经全部实现。
接下来我们开始配置service层,service层相对较为简单,我们只需要编写一个继承TransactionManagementConfigurer的类,
暂且命名为TransactionManagementConfiguration。因为主要用它来实现Spring 中的事务的支持。
我们依然需要加入@Configuration注解 并且还要加上@EnableTransactionManagement 表示允许支持事务。
//注入DataSourceConfiguration里面的dataSource,通过createDataSource()获取
@Autowired
//同样需要引入dataSource
private DataSource dataSource;
@Override
/**
* 关于事务的管理,需要返回PlatformTransactionManager实现
* */
public PlatformTransactionManager annotationDrivenTransactionManager(){
return new DataSourceTransactionManager(dataSource);
}
好了,接下来是web层,web层相对较为复杂。
编写一个名为MvcConfiguration的类,继承 WebMvcConfigurerAdapter ,并实现ApplicationContextAware 接口。
并加上注解 @Configuration @EnableWebMvc 这里表示开启WebMvc模式
我们需要定义如下几个功能
1.定义默认请求处理器
2.视图解析器,解析静态资源
3.文件上传解析器
4.拦截器
5.其他需要用的web层配置的地方,如kaptcha验证码
然后配置如下:
//Spring容器的全局变量
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
/**
* 静态资源配置
* */
@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\\");
}
/**
* 添加拦截器
* registry - 记录
* */
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截路径
String interceptPath = "/shopadmin/**";
//添加注册拦截器
InterceptorRegistration loginIR= registry.addInterceptor(new ShopLoginInterceptor());
//添加拦截路径
loginIR.addPathPatterns(interceptPath);
//添加操作拦截器
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");
/**shopmanager page */
permissionIR.excludePathPatterns("/shopadmin/shopmanagement");
permissionIR.excludePathPatterns("/shopadmin/getshopmanagementinfo");
}
/**
* 定义默认的请求处理器
* */
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/**
* 创建视图解析器
* */
@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;
}
/**
* 创建文件上传解析器
* */
@Bean(name = "multipartResolver")
public CommonsMultipartResolver createMultipartResolver(){
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
commonsMultipartResolver.setDefaultEncoding("utf-8");
//1024 x 1024 x 20 = 20M
commonsMultipartResolver.setMaxUploadSize(20971520);
commonsMultipartResolver.setMaxInMemorySize(20971520);
return commonsMultipartResolver;
}
/**
* Kaptcha 验证码
* */
@Value("${kaptcha.border}")
private String border;
@Value("${kaptcha.noise.color}")
private String ncolor;
@Value("${kaptcha.image.width}")
private String width;
@Value("${kaptcha.image.height}")
private String height;
@Value("${kaptcha.textproducer.font.color}")
private String fcolor;
@Value("${kaptcha.textproducer.font.names}")
private String fnames;
@Value("${kaptcha.textproducer.font.size}")
private String fsize;
@Value("${kaptcha.textproducer.char.string}")
private String cString;
@Value("${kaptcha.textproducer.char.length}")
private String clength;
@Bean
public ServletRegistrationBean servletRegistrationBean(){
ServletRegistrationBean servlet = new ServletRegistrationBean(new KaptchaServlet(),"/Kaptcha");
servlet.addInitParameter("kaptcha.border",border);//无边框
servlet.addInitParameter("kaptcha.noise.color",ncolor);//干扰线颜色
servlet.addInitParameter("kaptcha.image.width",width);//图片宽度
servlet.addInitParameter("kaptcha.image.height",height);//图片高度
servlet.addInitParameter("kaptcha.textproducer.font.color",fcolor);//字体颜色
servlet.addInitParameter("kaptcha.textproducer.font.names", fnames);//字体
servlet.addInitParameter("kaptcha.textproducer.font.size",fsize);//字体大小
servlet.addInitParameter("kaptcha.textproducer.char.string",cString);//使用那些字符生成
servlet.addInitParameter("kaptcha.textproducer.char.length",clength);//字符个数
return servlet;
}
然后我们继续补全application.properties的信息。
由于要项目中要支持Redis,我们也需要为Redis写一个配置类,名为RedisConfiguration,同样需要加入@Configuration注解。
@Value("${redis.hostname}") //主机ip
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}")//在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
private boolean testOnBorrow;
@Autowired
private JedisPoolConfig jedisPoolConfig; //jedis线程池配置文件
@Autowired
private JedisPoolWriper jedisWritePool;//jedis池包装类
@Autowired
private JedisUtil jedisUtil;//jedis工具类
/**
* 创建Redis连接池的设置
* */
@Bean(name = "jedisPoolConfig")
public JedisPoolConfig createJedisPoolConfig(){
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMaxTotal(maxTotal);
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
jedisPoolConfig.setTestOnBorrow(testOnBorrow);
return jedisPoolConfig;
}
/**
* 创建Redis连接池,并做相关配置
* */
@Bean(name = "jedisWritePool")
public JedisPoolWriper createJedisPoolWriper(){
JedisPoolWriper jedisPoolWriper = new JedisPoolWriper(jedisPoolConfig,hostname,port);
return jedisPoolWriper;
}
/**
* 创建Redis工具类
* */
@Bean(name = "jedisUtil")
public JedisUtil createJedisUtil(){
JedisUtil jedisUtil = new JedisUtil();
jedisUtil.setJedisPool(jedisWritePool);
return jedisUtil;
}
/**
* Redis的Key操作
*
* */
@Bean(name = "jedisKeys")
public JedisUtil.Keys createJedisKeys(){
JedisUtil.Keys jedisKeys = jedisUtil.new Keys();
return jedisKeys;
}
/**
* Redis的Strings操作
* */
@Bean(name = "jedisStrings")
public JedisUtil.Strings createJedisStrings(){
JedisUtil.Strings jedisStrings = jedisUtil.new Strings();
return jedisStrings;
}
/**
* Redis的Lists操作
*
* */
@Bean(name = "jedisLists")
public JedisUtil.Lists createJedisLists(){
JedisUtil.Lists jedisLists = jedisUtil.new Lists();
return jedisLists;
}
/**
* Redis的Sets操作
* */
@Bean(name = "jedisSets")
public JedisUtil.Sets createJedisSets(){
JedisUtil.Sets jedisSets = jedisUtil.new Sets();
return jedisSets;
}
/**
* Redis的HashMap操作
*
* */
@Bean(name = "jedisHash")
public JedisUtil.Hash createJedisHash(){
JedisUtil.Hash jedisHash = jedisUtil.new Hash();
return jedisHash;
}
这样一个完整个SpringBoot配置就完成了,由于里面有些用到自己需要的工具类,不需要可以去掉一些代码。
另外在pom.xml中也需要引入相关依赖,这里根据需要自己引入。包括拦截器,和JedisUtil等工具类需要自己编写然后才能引入否则
不能生效,总体而言相对于以前SSM框架的一堆xml配置文件。
SpringBoot看起来更加清爽,而且自带tomcat,启动项目也很简单。