1. 采用到的開源項(xiàng)目漫談

   Spring 迷人的依賴注入特性, 使其已經(jīng)穩(wěn)穩(wěn)的占據(jù)在 JavaEE 項(xiàng)目引用開源項(xiàng)目列表中的上層位置。

   秉承低耦合高內(nèi)聚的遵旨, Spring 提倡的對(duì)象工廠解耦類關(guān)系的思想已深入到每個(gè)攻城獅的心中。

   SpringMVC 做為 Spring 的干兒子,最讓我沉醉的是她強(qiáng)大的擴(kuò)展能力,深邃的像大海一樣。

   前端無論是 freemarker/velocity/jsp...,后端 DAO 層無論是傳統(tǒng)的 ORM 還是新近上位的領(lǐng)域模型。

   她的態(tài)度始終如一,給你360度最貼心的呵護(hù),有一人對(duì)你如此,此生足矣。

   官網(wǎng)地址:http://projects.spring.io/spring-framework/

   項(xiàng)目中關(guān)于 SpringMVC + Spring 的依賴:

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

       <!--spring mvc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.3.RELEASE</version>
        </dependency>

        <!-- Spring-orm -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.3.3.RELEASE</version>
        </dependency>

        <!-- Spring AOP 動(dòng)態(tài)代理 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.9</version>
        </dependency>

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

   這上面我想說的是 AspectJ 這個(gè)東東, AspectJ 是最早、功能比較強(qiáng)大的 AOP 實(shí)現(xiàn)之一。

   在 Java 領(lǐng)域,AspectJ 中的很多語法結(jié)構(gòu)基本上已成為 AOP 領(lǐng)域的標(biāo)準(zhǔn)。

   Spring 也有自己的 Spring-AOP,Spring-AOP 采用運(yùn)行時(shí)生成代理類,底層可以選用 JDK 或者 CGLIB 動(dòng)態(tài)代理。

   通俗點(diǎn),AspectJ 在編譯時(shí)增強(qiáng)要切入的類,而 Spring-AOP 是在運(yùn)行時(shí)通過代理類增強(qiáng)切入的類,效率和性能可想而知。

   所以 Spring 在 2.0 的時(shí)候就已經(jīng)開始支持 AspectJ ,現(xiàn)在到 4.X 的時(shí)代已經(jīng)很完美的和 AspectJ  結(jié)合到一起。

   有興趣的可以在接著讀讀:https://www.oschina.net/translate/comparative_analysis_between_spring_aop_and_aspectj?cmp

   Druid 出自阿里巴巴技術(shù)團(tuán)隊(duì)之手,個(gè)人認(rèn)為是比較好的數(shù)據(jù)庫連接池之一,尤其是監(jiān)控部分是我的最愛。

   官方 github 地址:https://github.com/alibaba/druid/wiki/常見問題

   項(xiàng)目中的 web.xml 配置監(jiān)控配置和監(jiān)控界面:

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

   <!--Druid 數(shù)據(jù)庫連接池監(jiān)控-->
    <servlet>
        <servlet-name>DruidStatView</servlet-name>
        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DruidStatView</servlet-name>
        <url-pattern>/druid/*</url-pattern>
    </servlet-mapping>

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

 

 photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

   JPA 作為 Sun 公司引入的 ORM 規(guī)范,就像是 JDBC 之于各種數(shù)據(jù)庫驅(qū)動(dòng) Jar,

   不要去在意使用了什么樣的數(shù)據(jù)庫,用 JDBC 提供的規(guī)范方法去擼代碼即可。

   JPA 制定持久層規(guī)范,相同與抽象接口,有 ORM 框架擼具體的實(shí)現(xiàn)層。

   Sun 想實(shí)現(xiàn) ORM 技術(shù)統(tǒng)一,可能不遠(yuǎn)的將來,你不用在糾結(jié)選擇什么樣子的 ORM 框架。

   而現(xiàn)有熱門的 ORM 框架會(huì)漸漸失去光澤,這畢竟是個(gè)漫長的過程,讓我們拭目以待。

回到頂部

2. 方案整體一覽

   方案中所有的類都位于 SpringContext 中,由 Spring 統(tǒng)一進(jìn)行管理。

   讓 Spring 統(tǒng)一管理的前提是你要告訴有這樣一個(gè)類需要它管理,目前我接觸到的告訴途徑有兩種。

   傳統(tǒng)的 xml 配置和注解方式,xml 配置和注解方式各有優(yōu)劣,比如 xml 配置的優(yōu)點(diǎn):

   a. 如果你公司項(xiàng)目在引用另外一個(gè)公司的 jar,這時(shí)候,唯一可行方式為 xml 配置。

   b. 如果類之間的依賴關(guān)系變動(dòng)頻繁,xml 配置是比較優(yōu)秀的,改動(dòng)代碼和改動(dòng)配置文件,無論是技術(shù)上還是風(fēng)險(xiǎn)上,xml 都穩(wěn)贏注解。

   注解聲明的方式優(yōu)點(diǎn):代碼和聲明在一起,開發(fā)的時(shí)候不用切來切去,比 xml 配置聲明要簡(jiǎn)單明了的多。

   現(xiàn)在很多主流的框架都引入了注解,但也無法擯棄 xml 配置聲明的方式。

   

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

   在這個(gè)方案中我使用干凈簡(jiǎn)單注解的方式,controller 包下使用注解@controller,dao-impl 包下使用@Repository,service 包下使用@service。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

  控制層注入服務(wù)實(shí)例,服務(wù)層注入數(shù)據(jù)訪問層對(duì)象,持久層對(duì)象由 JAP 進(jìn)行注解,頁面通過控制層來傳輸和獲取數(shù)據(jù)。

  web.xml:

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn) View Code

  maven pom.xml:

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn) View Code

回到頂部

3. DAO 層的種種設(shè)計(jì)思路

   Controller 和 Service 層非常容易理解,這里不贅述了。

   DAO 層 中 BasePo 希望將一些共有的屬性抽象在父類當(dāng)中(屬性由具體項(xiàng)目需求決定)。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn) BasePO

   BaseDaoImpl 希望將一些公共的數(shù)據(jù)訪問方法實(shí)現(xiàn)在父類當(dāng)中(我這里的方法可能有點(diǎn)少,可以由具體項(xiàng)目增加)。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn) BaseDaoImpl

   使用 JAP 注解編寫業(yè)務(wù)使用到的持久層對(duì)象。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

@Entity
@Table(name = "t_user")public class User extends BasePO {
    @Column(nullable = false)
    String name;
    @Column(nullable = false)
    String pwd;
   ....getter/setter }

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

   配置啟動(dòng)時(shí)掃描 POJO 的動(dòng)作,至于是新建還是更新都有配置選項(xiàng),可以自己查閱相關(guān)文檔。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

    <!-- 配置hibernate session工廠,需添加 spring-orm -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
            </props>
        </property>

        <!-- 自動(dòng)掃描注解方式配置的hibernate類文件 -->
        <property name="packagesToScan">
            <list>
                <value>com.rambo.sdh.pojo</value>
            </list>
        </property>
    </bean>

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

   操縱數(shù)據(jù)庫最主要的事務(wù)管理,采用 AOP 聲明方式,在執(zhí)行含有數(shù)據(jù)變動(dòng)的方法前后進(jìn)行攔截。

   采用 AOP 聲明方式進(jìn)行攔截的好處,不用去關(guān)注數(shù)據(jù)庫事務(wù)的開啟和關(guān)閉,將重心放到業(yè)務(wù)邏輯上面。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

<!-- 配置事務(wù)管理器 -->
    <bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <!-- 聲明式容器事務(wù)管理 ,transaction-manager指定事務(wù)管理器為transactionManager- -->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*"/>
            <tx:method name="save*"/>
            <tx:method name="update*"/>
            <tx:method name="modify*"/>
            <tx:method name="edit*"/>
            <tx:method name="delete*"/>
            <tx:method name="remove*"/>
            <tx:method name="repair"/>
            <tx:method name="deleteAndRepair"/>

            <tx:method name="get*" propagation="SUPPORTS"/>
            <tx:method name="find*" propagation="SUPPORTS"/>
            <tx:method name="load*" propagation="SUPPORTS"/>
            <tx:method name="search*" propagation="SUPPORTS"/>
            <tx:method name="datagrid*" propagation="SUPPORTS"/>
            <tx:method name="*" propagation="SUPPORTS"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:pointcut id="transactionPointcut" expression="execution(* com.rambo.sdh.service..*Impl.*(..))"/>
        <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice"/>
    </aop:config>

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

   上面配置文件的大體意思是說,在包 com.rambo.sdh.service..*Impl.* 下所執(zhí)行的已 add/save/update.....開頭的方法。

   方法在執(zhí)行前后都會(huì)被 HibernateTransactionManager 攔截住,進(jìn)行事務(wù)的開啟和關(guān)閉。

   當(dāng)然還有一些其他的事情,有興趣可以 debug 源碼去一探究竟。

   貌似說的也差不多了,該方案為 javaweb 后端解決方案,前端用你想用的渲染技術(shù)即可。

   項(xiàng)目開源 GIT 地址已在最上面給出,如果有興趣的可以檢出到本地跑一跑,該方案中小公司其實(shí)都挺適合,上手和開發(fā)速度快。