SpringBoot项目配置

这里结合自己从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层的包,里面我们建两个类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层的包路径)。



像这样配置,接着我们开始编写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,启动项目也很简单。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,478评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,825评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,482评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,726评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,633评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,018评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,168评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,320评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,264评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,288评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,995评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,587评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,909评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,284评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,862评论 2 339

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,561评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,531评论 18 399
  • 引入Maven依赖<dependency> <groupId>io.springfox</groupId> ...
    灰气球阅读 1,017评论 0 1
  • 一. Java基础部分.................................................
    wy_sure阅读 3,780评论 0 11
  • 陶三哥在一片狼藉的农场四周转来转去转了好⺇圈了。还是不忍离开。旁边他的女人陶三嫂催了他很多次。 走吧,没办法。 陶...
    四川一芬阅读 190评论 0 3