sprng mvc + mybatis 徹底註解配置, 零xml文件

寫在前面

自從有了spring boot以後, 起一個web項目變的很是簡單,
本篇文章主要講解在不使用spring boot的自動配置的狀況下, 如何使用spring mvc 搭建一個web項目
servlet3.0 後能夠拋棄web.xml了, 因此本文也不會有任何xml文件, 所有使用`java config`的形式

建立項目

首先, 使用idea建立一個maven項目, 就叫 spring-web好了

clipboard.png

使用spring mvc + mybatis + freemarker 搭建項目
spring.version=4.3.14.RELEASE
依賴的jar, 完整的 pom 文件以下:
<dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.8</version>
        </dependency>

        <!-- freemarker -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>

        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>

        <!-- database -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>

    </dependencies>

使用java配置

servlet 3.0 後, servlet 容器啓動時會調用實現了ServletContainerInitializer接口的類,
spring mvc 的 SpringServletContainerInitializer實現了此接口, 在源碼中能夠看到實現中會循環調用WebApplicationInitializer的實現類html

spring mvc 爲了簡化java的配置, 提供了AbstractAnnotationConfigDispatcherServletInitializer抽象類來簡化配置, 雖然類名很長

新建一個配置類叫 WebAppInitializer, 繼承上面那個名字很長的類⬆️
感受這個就至關於以前的web.xml了, 若是之前熟悉spring web項目xml配置的同窗, 很容易就能發現rootConfig 和 ServletConfig 很像以前的兩個spring的 xml配置文件
若是須要配置其餘 servlet 能夠重寫 onStartup()java

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    // rootConfig 想當於以前的 application-context.xml
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringContextConfig.class};
    }

    // servletConfig 至關於以前的 mvc-servlet.xml
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    // DispatchServlet 路徑
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/*"};
    }

    // 配置filters
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
        encodingFilter.setEncoding(String.valueOf(StandardCharsets.UTF_8));
        encodingFilter.setForceEncoding(true);
        return new Filter[]{encodingFilter};
    }
}

SpringContextConfig

這裏能夠配置數據源, 事務管理器, 啓用註解掃描, 開啓aop, 和其餘框架集成(通常是orm框架, 這裏咱們使用mybatis)
是否是感受很想以前的 application-context.xml裏面的配置mysql

PS: 若是 SpringMvcConfig 配置類在 SpringContextConfig 配置的包掃描下的話, 那須要將 SpringMvcConfig類排除掉, 要否則 SpringMvcConfig 類會初始化2次web

@EnableAspectJAutoProxy
@EnableTransactionManagement
@PropertySource("classpath:application.properties")
@ComponentScan(basePackages = {"cat.spring.web"},
        excludeFilters = {@ComponentScan.Filter(classes = Controller.class), @ComponentScan.Filter(classes = EnableWebMvc.class)})
public class SpringContextConfig {

    @Bean
    public DataSource dataSource(Environment env) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setJdbcUrl(env.getProperty("db.url"));
        dataSource.setDriverClass(env.getProperty("db.driver"));
        dataSource.setUser(env.getProperty("db.user"));
        dataSource.setPassword(env.getProperty("db.password"));
        dataSource.setMinPoolSize(Integer.valueOf(env.getProperty("pool.minPoolSize")));
        dataSource.setMaxPoolSize(Integer.valueOf(env.getProperty("pool.maxPoolSize")));
        dataSource.setAutoCommitOnClose(false);
        dataSource.setCheckoutTimeout(Integer.valueOf(env.getProperty("pool.checkoutTimeout")));
        dataSource.setAcquireRetryAttempts(2);
        return dataSource;
    }

    /**
     * 配置事物管理器
     *
     * @param dataSource
     * @retur
     */
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * myBatis 配置
     *
     * @param dataSource
     * @return
     */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {

        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setTypeAliasesPackage("cat.spring.web.entity");
        sessionFactoryBean.setMapperLocations(new ClassPathResource[]{new ClassPathResource("/mapper/**/*.xml")});

        Configuration configuration = new Configuration();
        configuration.setUseGeneratedKeys(true);
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setUseColumnLabel(true);
        sessionFactoryBean.setConfiguration(configuration);

        return sessionFactoryBean;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer configurer = new MapperScannerConfigurer();
        configurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        configurer.setBasePackage("cat.spring.web.mapper");

        return configurer;
    }
    
}

給出 application.properties文件的配置spring

db.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&allowMultiQueries=true
db.driver=com.mysql.jdbc.Driver
db.user=root
db.password=123456

#數據庫鏈接池配置
#鏈接池中保留的最小鏈接數
pool.minPoolSize=5
#鏈接池中保留的最大鏈接數
pool.maxPoolSize=30
#獲取鏈接超時時間
pool.checkoutTimeout=1000

freemarker.request-context-attribute=rc
freemarker.expose-request-attributes=true
freemarker.expose-session-attributes=true
freemarker.prefer-file-system-access=false

SpringMvcConfig

SpringMvcConfig 主要配置spring mvc的攔截器, jsp或者freemarke等視圖, 或者其餘一些spring mvc 的配置sql

@EnableWebMvc
@PropertySource("classpath:application.properties")
@ComponentScan(basePackages = "cat.spring.web.controller", includeFilters = @ComponentScan.Filter(classes = Controller.class), useDefaultFilters = false)
public class SpringMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
    }
    
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/index").setViewName("index");
    }

    /**
     * 配置 freemarker
     * @return FreeMarkerConfigurer
     */
    @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer(Environment env) {
        FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
        freeMarkerConfigurer.setTemplateLoaderPath("classpath:/templates/");
        freeMarkerConfigurer.setPreferFileSystemAccess(env.getProperty("freemarker.prefer-file-system-access", boolean.class, false));
        freeMarkerConfigurer.setDefaultEncoding(String.valueOf(StandardCharsets.UTF_8));

        return freeMarkerConfigurer;
    }

    @Bean
    public ViewResolver freemarkerViewResolver(Environment env) {

        FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver("", ".ftl");
        viewResolver.setViewClass(FreeMarkerView.class);
        viewResolver.setCache(false);
        viewResolver.setContentType("text/html;charset=utf-8");
        viewResolver.setRequestContextAttribute(env.getProperty("freemarker.request-context-attribute", "rc"));
        viewResolver.setExposeRequestAttributes(env.getProperty("freemarker.expose-request-attributes", boolean.class, true));
        viewResolver.setExposeSessionAttributes(env.getProperty("freemarker.expose-session-attributes", boolean.class, true));

        return viewResolver;
    }
}

運行

到這裏項目配置部分就結束了, 咱們可使用maven 的tomecat插件運行數據庫

<build>
        <finalName>spring-web</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <username>tomcat</username>
                    <password>123456</password>
                    <uriEncoding>utf-8</uriEncoding>
                    <path>/cat</path>
                    <port>8080</port>
                    <update>false</update>
                    <!--<warSourceDirectory>${basedir}/src/main/webapp</warSourceDirectory>-->
                </configuration>
            </plugin>
        </plugins>
    </build>

執行命令: mvn tomcat7:runapache

相關文章
相關標籤/搜索