• JavaConfig 极简整合 SSM


    前言

    传统的 XML 文件配置整合 SSM 框架是不是很繁琐? 如果框架搭建好了想移植到另外一个项目,又要在各种 XML 文件中许多参数, 缺少很快的配置移植性。

    针对这些麻烦的问题,我做了一种 JavaConfig 自动整合方案,几乎不需要编写任何 XML 文件,包括 web.xml 文件。仅仅配置数据库的连接属性,三个框架就搭建完成了。

    项目结构

    Application.java 是核心配置类,所有的整合配置全部在里面。该类使用注解的方式配置了 Spring Bean ,使用 WebApplicationInitializer 接口配置了 web.xml 中的内容。

    application.xml 是 Spring 的核心配置文件,主要只需要配置扫描的包即可

    Application.java

    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.support.http.StatViewServlet;
    import com.alibaba.druid.support.http.WebStatFilter;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.mapper.MapperScannerConfigurer;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.web.WebApplicationInitializer;
    import org.springframework.web.context.ContextLoaderListener;
    import org.springframework.web.context.support.XmlWebApplicationContext;
    import org.springframework.web.filter.CharacterEncodingFilter;
    import org.springframework.web.servlet.DispatcherServlet;
    import org.springframework.web.servlet.ViewResolver;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.view.InternalResourceViewResolver;
    
    import javax.servlet.FilterRegistration;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletRegistration;
    
    /**
     * SSMBoot Core Configuration Object 简化版
     *
     * Application.java 位置必须在项目最外层
     * application.xml 配置文件名必须一致, 所有 Spring 的配置必须在该文件内
     *
     * @author haidnor
     */
    public class Application {
    
        static final String DRUID_URL = "jdbc:mysql://wangxiang.zone:33061/ssm";
        static final String DRUID_USERNAME = "root";
        static final String DRUID_PASSWORD = "root";
        static final String DRUID_DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
    
        /* Default ------------------------------------------------------------------------------------------------------ */
    
        static final String SPRING_MVC_VIEW_RESOLVER_PREFIX = "/";
        static final String SPRING_MVC_VIEW_RESOLVER_SUFFIX = ".html";
    
        static final String APPLICATION = Application.class.getPackage().getName();
        static final String MAPPER_PACKAGE = APPLICATION;
        static final String MYBATIS_TYPE_ALIASES_PACKAGE = APPLICATION;
        static final String MYBATIS_MAPPER_LOCATIONS = "classpath*:" + APPLICATION.replace('.', '/') + "/**.xml";
    
        /* WebApplicationInitializer ------------------------------------------------------------------------------------ */
    
        static class WebContext implements WebApplicationInitializer {
    
            ServletContext servletContext = null;
    
            @Override
            public void onStartup(ServletContext container) {
                servletContext = container;
                addDispatcherServlet();
                addDruidStatViewServlet();
                addCharacterEncodingFilter();
                addContextLoaderListener();
                addDruidWebStatFilter();
            }
    
            void addDispatcherServlet() {
                XmlWebApplicationContext appContext = new XmlWebApplicationContext();
                appContext.setConfigLocation("classpath:application.xml");
                ServletRegistration.Dynamic dispatcherServlet =
                        servletContext.addServlet("DispatcherServlet", new DispatcherServlet(appContext));
                dispatcherServlet.setLoadOnStartup(1);
                dispatcherServlet.addMapping("/");
            }
    
            void addDruidStatViewServlet() {
                StatViewServlet statViewServlet = new StatViewServlet();
                ServletRegistration.Dynamic druidStatView =
                        servletContext.addServlet("DruidStatView", statViewServlet);
            }
    
            void addDruidWebStatFilter() {
                WebStatFilter webStatFilter = new WebStatFilter();
                webStatFilter.isExclusion("*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
                FilterRegistration.Dynamic druidWebStatFilter =
                        servletContext.addFilter("DruidWebStatFilter", webStatFilter);
                druidWebStatFilter.addMappingForUrlPatterns(null, false, "/*");
            }
    
            void addCharacterEncodingFilter() {
                CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
                characterEncodingFilter.setEncoding("UTF-8");
                FilterRegistration.Dynamic encodingFilter =
                        servletContext.addFilter("characterEncodingFilter", characterEncodingFilter);
                encodingFilter.addMappingForUrlPatterns(null, false, "/");
            }
    
            void addContextLoaderListener() {
                servletContext.setInitParameter("contextConfigLocation", "classpath:application.xml");
                servletContext.addListener(new ContextLoaderListener());
            }
        }
    
        // Components ------------------------------------------------------------------------------------------------------
    
        @Configuration
        static class DataSource {
    
            static final DruidDataSource DRUID_DATA_SOURCE = druidDataSource();
    
            @Bean
            MapperScannerConfigurer mapperScanner() {
                MapperScannerConfigurer mapperScanner = new MapperScannerConfigurer();
                mapperScanner.setBasePackage(MAPPER_PACKAGE);
                mapperScanner.setSqlSessionFactoryBeanName("sqlSessionFactory");
                return mapperScanner;
            }
    
            @Bean("sqlSessionFactory")
            SqlSessionFactoryBean sqlSessionFactoryBean() throws Exception {
                SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
                sqlSessionFactoryBean.setDataSource(DRUID_DATA_SOURCE);
                sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MYBATIS_MAPPER_LOCATIONS));
                sqlSessionFactoryBean.setTypeAliasesPackage(MYBATIS_TYPE_ALIASES_PACKAGE);
                return sqlSessionFactoryBean;
            }
    
            @Bean
            DataSourceTransactionManager dataSourceTransactionManager() {
                DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
                transactionManager.setDataSource(DRUID_DATA_SOURCE);
                return transactionManager;
            }
    
            @Bean
            static DruidDataSource druidDataSource() {
                DruidDataSource dataSource = new DruidDataSource();
                dataSource.setDriverClassName(DRUID_DRIVER_CLASS_NAME);
                dataSource.setUrl(DRUID_URL);
                dataSource.setUsername(DRUID_USERNAME);
                dataSource.setPassword(DRUID_PASSWORD);
                return dataSource;
            }
        }
    
        @Configuration
        @EnableWebMvc
        static class Web {
            @Bean
            ViewResolver viewResolver() {
                InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
                viewResolver.setPrefix(SPRING_MVC_VIEW_RESOLVER_PREFIX);
                viewResolver.setSuffix(SPRING_MVC_VIEW_RESOLVER_SUFFIX);
                viewResolver.setExposeContextBeansAsAttributes(true);
                return viewResolver;
            }
        }
    
    }
    

    application.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
    	   http://www.springframework.org/schema/beans/spring-beans.xsd
     	   http://www.springframework.org/schema/tx
    	   http://www.springframework.org/schema/tx/spring-tx.xsd
    	   http://www.springframework.org/schema/mvc
    	   http://www.springframework.org/schema/mvc/spring-mvc.xsd
    	   http://www.springframework.org/schema/context
    	   http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:component-scan base-package="cn.haidnor.project"/>
    
    </beans>
    

    maven

        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <junit.version>4.11</junit.version>
            <commons-logging.version>1.2</commons-logging.version>
            <log4j.version>1.2.17</log4j.version>
            <org.springframework.version>5.0.8.RELEASE</org.springframework.version>
            <aspectjweaver.version>1.8.13</aspectjweaver.version>
            <aopalliance.version>1.0</aopalliance.version>
            <mysql-connector-java.version>5.1.49</mysql-connector-java.version>
            <druid.version>1.0.9</druid.version>
            <mybatis.version>3.4.5</mybatis.version>
            <mybatis-spring.version>1.3.1</mybatis-spring.version>
            <javaee-api.version>7.0</javaee-api.version>
            <jackson.version>2.9.5</jackson.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
                <version>${commons-logging.version}</version>
            </dependency>
    
            <dependency>
                <groupId>javax</groupId>
                <artifactId>javaee-api</artifactId>
                <type>jar</type>
                <version>${javaee-api.version}</version>
                <scope>compile</scope>
                <optional>false</optional>
            </dependency>
    
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
    
            <!--spring core start-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-indexer</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <!--spring core end-->
    
            <!--spring aop start-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <!--spirng aop end-->
    
            <!--spring aspects start-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <!--spring aspects end-->
    
            <!--spring instrumentation start -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-instrument</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <!--spring instrumentation end-->
    
            <!--spring messaging start -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-messaging</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <!--spring messaging end-->
    
            <!--spring data access start -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-orm</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-oxm</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jms</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <!--spring data access end-->
    
            <!--spring web start -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-websocket</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webflux</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <!--spring web end -->
    
            <!--spring test start -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <!--spring test end -->
    
            <!-- MySQL -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql-connector-java.version}</version>
            </dependency>
    
            <!-- MyBaits -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
    
            <!-- MyBaits 与 Spring 的整合包 -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>${mybatis-spring.version}</version>
            </dependency>
    
            <!-- Druid -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
    
            <!--jackson依赖-->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>${jackson.version}</version>
            </dependency>
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>${jackson.version}</version>
            </dependency>
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>${jackson.version}</version>
            </dependency>
    
            <dependency>
                <groupId>com.fasterxml.jackson.module</groupId>
                <artifactId>jackson-module-jaxb-annotations</artifactId>
                <version>${jackson.version}</version>
            </dependency>
        </dependencies>
    
        <build>
            <finalName>SSMBoot</finalName>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <artifactId>maven-clean-plugin</artifactId>
                        <version>3.1.0</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-resources-plugin</artifactId>
                        <version>3.0.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.8.0</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>2.22.1</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>3.2.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-install-plugin</artifactId>
                        <version>2.5.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-deploy-plugin</artifactId>
                        <version>2.8.2</version>
                    </plugin>
                </plugins>
            </pluginManagement>
    
            <plugins>
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                    <configuration>
                        <path>/</path>
                        <port>8080</port>
                    </configuration>
                </plugin>
            </plugins>
    
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.*</include>
                    </includes>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.*</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
    
  • 相关阅读:
    hdoj 3376,2686 Matrix Again 【最小费用最大流】
    Trustie站点代码托管使用指南
    POJ 2442 Sequence(堆的使用练习)
    猛犸机器学习开发实践
    关于《金字塔原理》的主要内容
    实战案例:如何快速打造1000万+播放量的抖音网红?
    【限时特惠】网易云易盾验证码全线95折!智能无感知、滑动拼图、点选验证-7天免费体验!
    当GDPR来敲门,中国互联网企业该如何应对?
    H5活动产品设计指南基础版
    Box(视图组件)如何在多个页面不同视觉规范下的复用
  • 原文地址:https://www.cnblogs.com/Haidnor/p/13661235.html
Copyright © 2020-2023  润新知