SpringBoot项目配置

这里结合自己从SSM框架把项目转移到Springboot的经历,谈一下SpringBoot详细的搭建过程。

http://start.spring.io/中 填好相关的信息

SpringBoot项目配置_第1张图片

然后把项目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相关的信息


SpringBoot项目配置_第2张图片

相关的配置是这样的,前面的server.port是项目默认启动的端口,context-path代表的是我们访问项目的前缀,如localhost:8080/o2o/xxx。

然后我们在config下再建一个dao层的包,里面我们建两个类DataSourceConfigurationSessionFactoryConfiguration

我们先完成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层的包路径)。


SpringBoot项目配置_第3张图片


像这样配置,接着我们开始编写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的信息。

SpringBoot项目配置_第4张图片


由于要项目中要支持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,启动项目也很简单。

你可能感兴趣的:(SpringBoot项目配置)