1. 程式人生 > >J2EE專案系列(三)--Spring Data JPA+Spring+SpringMVC+Maven快速開發(1)專案架構

J2EE專案系列(三)--Spring Data JPA+Spring+SpringMVC+Maven快速開發(1)專案架構

好久沒給大家弄Java後端專案系列了,因為接了Java後端外包以及學習一些後端優化的東西。而現在開始慢慢在這個系列的(三)逐漸把後端外包的一些有價值的東西分享給大家,並且自己也總結一遍嘛。

文章結構:(1)專案環境搭建;(2)簡單業務邏輯測試框架;(3)專案配置注意點;(4)快速開發上手技巧;

一、專案環境搭建:

專案框架:Spring Data JPA+Spring+SpringMVC+Maven+JDK1.7+Tomcat7.0

使用IDEA開發

(1)Maven構建:

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.fuzhu</groupId> <artifactId>springdatajpa</artifactId> <packaging>war</packaging
>
<version>1.0-SNAPSHOT</version> <name>springdatajpa Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.build.timestamp.format>yyyyMMdd'T'HHmmss</maven.build.timestamp.format
>
<buildNumber>${maven.build.timestamp}</buildNumber> <maven.compiler.target>1.7</maven.compiler.target> <maven.compiler.source>1.7</maven.compiler.source> <java-version>1.7</java-version> <version-springframework>4.0.4.RELEASE</version-springframework> <version-slf4j>1.6.6</version-slf4j> <version-hibernate.validator>5.0.1.Final</version-hibernate.validator> <version-hibernate.jpa>1.0.1.Final</version-hibernate.jpa> <version-hibernate>4.2.6.Final</version-hibernate> <mysql.version>5.1.35</mysql.version> </properties> <dependencies> <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${version-springframework}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${version-springframework}</version> </dependency> <!-- spring 表示式語言 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${version-springframework}</version> </dependency> <!-- 核心工具包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${version-springframework}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${version-springframework}</version> <exclusions> <!-- Exclude Commons Logging in favor of SLF4j --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- spring-context 的擴充套件支援,用於 MVC 方面 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${version-springframework}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${version-springframework}</version> </dependency> <!-- springIoC(依賴注入)的基礎實現 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${version-springframework}</version> </dependency> <!-- Spring事務支援 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${version-springframework}</version> </dependency> <!-- spring 對Junit 等測試框架的簡單封裝 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${version-springframework}</version> </dependency> <!--hibernate的包--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${version-hibernate}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${version-hibernate}</version> <exclusions> <exclusion> <artifactId>cglib</artifactId> <groupId>cglib</groupId> </exclusion> <exclusion> <artifactId>dom4j</artifactId> <groupId>dom4j</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>${version-hibernate.validator}</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>${version-hibernate.jpa}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>${version-hibernate}</version> </dependency> <!-- Spring data jpa --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.6.2.RELEASE</version> </dependency> <!-- AspectJ --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.10</version> </dependency> <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${version-slf4j}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${version-slf4j}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- logger end--> <!-- slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.7</version> </dependency> <!--slf4j-log4j12 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- druid dataSource --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.0</version> </dependency> <!--mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- Apache Commons Dependencies --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-digester3</artifactId> <version>3.2</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-exec</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.1</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.9</version> </dependency> <!--common end--> <!-- https://mvnrepository.com/artifact/cglib/cglib --> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency> <!--fastjson--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.1.0</version> </dependency> <!-- junit測試的包--> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-library</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <!-- 固定版本1.7--> <build> <finalName>springdatajpa</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </build> </project>

(2).spring配置檔案:

<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--掃描資原始檔-->
    <context:property-placeholder location="classpath:database.properties" ignore-unresolvable="true"/>
    <!--Druid資料來源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="${database.driverClassName}"/>
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
        <!-- 申請連線時執行validationQuery檢測連線是否有效,配置為true會降低效能 -->
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />
        <!-- 申請連線的時候檢測 -->
        <property name="testWhileIdle" value="false" />
        <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="1800000" />
        <!-- 配置一個連線在池中最小生存的時間,單位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="1800000" />
        <property name="defaultAutoCommit" value="false" />

    </bean>


    <!-- 指定事務管理器,JPA使用JpaTransactionManager事務管理器實現. -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <!-- 指定JPA實現 -->
    <bean id="jpaVendorAdapter"
        class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="showSql" value="false" />
    </bean>

    <!-- 適用於所有環境的FactoryBean,能全面控制EntityManagerFactory配置,如指定Spring定義的DataSource等等. -->
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <!-- 指定持久化單元名字,即JPA配置檔案中指定的 -->
        <property name="persistenceUnitName" value="com.ima" />
        <!-- 見上 -->
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
        <!-- 見上 -->
        <property name="dataSource" ref="dataSource" />
    </bean>

<!-- 對映jpa介面-->
    <jpa:repositories base-package="com.ima.repository" />

    <!-- 開啟事務管理註解 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>


</beans>

(3).springMVC的配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">


    <!-- 開啟SpringMVC註解 -->
    <mvc:annotation-driven />

    <!-- 只掃描Controller 註解 -->
    <context:component-scan base-package="com.ima.controller" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
        <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
    </context:component-scan>


    <!-- 定義檢視解析器 -->
    <bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
        <property name="contentType" value="text/html;charset=UTF-8"/>
    </bean>
    <!-- 用於返回json格式 -->
    <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>application/x-www-form-urlencoded;charset=UTF-8</value>
            </list>
        </property>
    </bean>

    <!--上傳檔案配置-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"/>
        <property name="maxUploadSize" value="10485760"/>
        <property name="maxInMemorySize" value="40960"/>
    </bean>


    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <!--字串編碼轉換-->
            <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
</beans>

(4).資料來源的配置:

database.url=jdbc:mysql://127.0.0.1:3306/aidou?useUnicode=true&characterEncoding=utf8
database.username=root
database.password=751197996
database.driverClassName=com.mysql.jdbc.Driver

(5).log4j的日誌配置(見原始碼)

(6).JPA的配置包,指定持久化單元:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="com.ima" transaction-type="RESOURCE_LOCAL">

        <!--ENABLE_SELECTIVE[(預設和推薦值):實體不快取,除非明確標記為可快取的。] DISABLE_SELECTIVE[實體快取,除非明確標記為不快取] NONE[無快取] ALL[全部快取]-->
        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
        <properties>
            <!-- 使用MySQL方言 -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>

            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
            <property name="hibernate.connection.url" value="jdbc:mysql:///aidou" />
            <property name="hibernate.connection.username" value="root" />
            <property name="hibernate.connection.password" value="751197996" />

            <property name="hibernate.connection.charSet" value="UTF-8" />
            <!-- 自動輸出schema建立DDL語句 -->
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <!-- 顯示SQL語句 -->
            <property name="hibernate.show_sql" value="true" />
            <!-- 在顯示SQL語句時格式化語句 -->
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.use_sql_comments" value="true" />

             <!--org.hibernate.cache.EhCacheRegionFactory -->
            <!-- Enable Batching -->
            <property name="hibernate.jdbc.batch_size" value="20" />
            <property name="hibernate.default_batch_fetch_size" value="10" />

            <!-- Hibernate二級快取相關配置 -->