<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    海鷗航際

    JAVA站
    posts - 11, comments - 53, trackbacks - 1, articles - 102

    Spring Framework之最佳實踐

    Posted on 2005-01-12 20:45 海天一鷗 閱讀(738) 評論(0)  編輯  收藏 所屬分類: J2EE

     

     

    Spring Framework從誕生之日起,受到了越來越多的關(guān)注。最近,新的開源項目大多支持Spring Framework。國內(nèi)目前也有專門的網(wǎng)站(http://spring.jactiongroup.net/)。那它為什么如此受歡迎呢?

    我想最重要的是,EJB讓每個人都痛恨。要編寫一個EJB,需要寫LocalHome, RemoteHome, Bean, LocalInterface, RemoteInterface,需要一個標(biāo)準(zhǔn)描述符,一個特殊廠商描述符(Weblogic、WebSphere都不一樣),如果是Entity Bean,還需要Mapping文件。如此之多,實在麻煩。但EJB最重要的是解決Transaction問題,沒有Spring之前,沒有其他方法能夠描述式的解決它。每個人、每個公司為了解決Transaction的問題,編程的寫法都不一樣,百花齊放。于是,在最需要它的時候,Spring出現(xiàn)了。

    Spring的功能非常多。但對于一個產(chǎn)品,最重要的是如何用好它的精華。Spring包含AOP、ORM、DAO、Context、Web、MVC幾個部分組成。Web、MVC暫不用考慮,用成熟的Struts、JSP或Webwork更好。DAO由于目前Hibernate、JDO的流行,也可不考慮。因此最需要用的是AOP、ORM、Context。

    Context中,最重要的是Beanfactory,它是將接口與實現(xiàn)分開,非常重要。以前我們寫程序,如一個接口IDocument,一個實現(xiàn)類Document1。在寫程序時,需寫成IDocument doc = new Document1(),一旦我們的實現(xiàn)類需改變時,變?yōu)镈ocument2,則程序需寫成IDocument doc = new Document2(),所有用到的地方全需改。Beanfactory幫我們解決了這個問題,用context后,寫法變?yōu)镮Document doc=(IDocument)beanFactory.getBean("doc")。如果實現(xiàn)類從Document1改為Document2,直接在配置文件改就可以了。Context是Bean factory的進一步抽象。很多人都喜歡用ApplicationConext,用Servlet把它Load。這樣就把Bean Factory與Web綁定在一起。如果是Fat Client或Remote調(diào)用,則這些Bean factory就很難調(diào)用,實際是將表現(xiàn)層與業(yè)務(wù)層綁定的太緊。推薦的方法是SingletonBeanFactoryLocator。具體為:

       BeanFactoryLocator bfLocator = SingletonBeanFactoryLocator.getInstance();
       BeanFactoryReference bf = bfLocator.useBeanFactory("beanFactory");
       // now use some bean from factory
       return bf.getFactory().getBean(name);

     

     <beans>

         <bean id="beanFactory" class="org.springframework.context.support.ClassPathXmlApplicationContext">
         <constructor-arg>
          <list>
           <value>dataAccessContext.xml</value>
           <value>securityContext.xml</value>
           <value>...</value>
          </list>
         </constructor-arg>
        </bean>

    </beans>


    這樣,就可隨時動態(tài)擴展,實現(xiàn)組件式的開發(fā)。

    Spring Framework最得以出名的是與Hibernate的無縫鏈接,基本上用Spring,就會用Hibernate。可惜的是Spring提供的HibernateTemplate功能顯得不夠,使用起來也不是很方便。我們編程序時,一般先寫B(tài)usinessService,由BusinessService調(diào)DAO來執(zhí)行存儲,在這方面Spring沒有很好的例子,造成真正想用好它,并不容易。

    我們的思路是先寫一個BaseDao,仿照HibernateTemplate,將基本功能全部實現(xiàn):

    public class BaseDao extends HibernateDaoSupport{

        private Log log = LogFactory.getLog(getClass());

        public Session openSession() {
            return SessionFactoryUtils.getSession(getSessionFactory(), false);
        }

        public Object get(Class entityClass, Serializable id) throws DataAccessException {
            Session session = openSession();
            try {
                return session.get(entityClass, id);
            }
            catch (HibernateException ex) {
                throw SessionFactoryUtils.convertHibernateAccessException(ex);
            }
        }

        public Serializable create(Object entity) throws DataAccessException {
            Session session = openSession();
            try {
                return session.save(entity);
            }
            catch (HibernateException ex) {
                throw SessionFactoryUtils.convertHibernateAccessException(ex);
            }
        }

    ...

    其它的DAO,從BaseDao繼承出來,這樣寫其他的DAO,代碼就會很少。

    從BaseDao繼承出來EntityDao,專門負(fù)責(zé)一般實體的基本操作,會更方便。

    public interface EntityDao {

        public Object get(Class entityClass, Serializable id) throws DataAccessException;

        public Object load(Class entityClass, Serializable id) throws DataAccessException;

        public Serializable create(Object entity) throws DataAccessException;
    ...}

    /**
     * Base class for Hibernate DAOs.  This class defines common CRUD methods for
     * child classes to inherit. User Sping AOP Inteceptor
     */
    public class EntityDaoImpl extends BaseDao implements EntityDao{

    }

    為了Transaction的控制,采用AOP的方式:

    public interface EntityManager {

        public Object get(Class entityClass, Serializable id);

        public Object load(Class entityClass, Serializable id);

        public Serializable create(Object entity);
    ...

    }

    /**
     * Base class for Entity Service. User Sping AOP Inteceptor
     */
    public class EntityManagerImpl implements EntityManager {

        private EntityDao entityDao;

        public void setEntityDao(EntityDao entityDao) {
            this.entityDao = entityDao;
        }

        public Object get(Class entityClass, Serializable id) {
            return entityDao.get(entityClass, id);
        }

        public Object load(Class entityClass, Serializable id) {
            return entityDao.load(entityClass, id);
        }
    ...

    }

    這樣我們就有了一個通用的Hibernate實體引擎,可以對任何Hibernate實體實現(xiàn)基本的增加、修改、刪除、查詢等。

    其它的BusinessService就可以繼承EntityManager,快速實現(xiàn)業(yè)務(wù)邏輯。

    具體XML配置如下:

     <!-- Oracle JNDI DataSource for J2EE environments -->
     <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName"><value>java:comp/env/jdbc/testPool</value></property>
     </bean>

     <!-- Hibernate SessionFactory for Oracle -->
     <!-- Choose the dialect that matches your "dataSource" definition -->
     <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
      <property name="dataSource"><ref local="dataSource"/></property>
      <property name="mappingResources">
       <value>user-hbm.xml</value>
      </property>
      <property name="hibernateProperties">
       <props>
        <prop key="hibernate.dialect">net.sf.hibernate.dialect.OracleDialect</prop>
        <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.Provider</prop>
        <prop key="hibernate.cache.use_query_cache">true</prop>
                      <prop key="hibernate.show_sql">false</prop>
       </props>
      </property>
     </bean>

     <!-- AOP DAO Intecepter -->
            <bean id="hibernateInterceptor" class="org.springframework.orm.hibernate.HibernateInterceptor">
              <property name="sessionFactory">
                <ref bean="sessionFactory"/>
              </property>
            </bean>

            <bean id="entityDaoTarget" class="com.gpower.services.entity.dao.EntityDaoImpl">
              <property name="sessionFactory">
                <ref bean="sessionFactory"/>
              </property>
            </bean>

            <bean id="entityDao" class="org.springframework.aop.framework.ProxyFactoryBean">
              <property name="proxyInterfaces">
                <value>com.gpower.services.entity.dao.EntityDao</value>
              </property>
              <property name="interceptorNames">
                <list>
                  <value>hibernateInterceptor</value>
                  <value>entityDaoTarget</value>
                </list>
              </property>
            </bean>

     <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
     <bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
      <property name="sessionFactory"><ref local="sessionFactory"/></property>
     </bean>

     <!-- Transaction manager that delegates to JTA (for a transactional JNDI DataSource) -->
     <!--
     <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
     -->

     <!-- Transactional proxy for the Application primary business object -->
            <bean id="entityManagerTarget" class="com.gpower.services.entity.EntityManagerImpl">
              <property name="entityDao">
                <ref bean="entityDao"/>
              </property>
            </bean>

            <bean id="entityManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
              <property name="transactionManager">
                <ref bean="transactionManager"/>
              </property>
              <property name="target">
                <ref bean="entityManagerTarget"/>
              </property>
              <property name="transactionAttributes">
         <props>
           <prop key="get*">PROPAGATION_SUPPORTS</prop>
           <prop key="*">PROPAGATION_REQUIRED</prop>
         </props>
              </property>
            </bean>

    資源:Spring+Hibernate培訓(xùn)ppt

     

     

     

     

    主站蜘蛛池模板: 在线看片免费人成视频播| 爱情岛亚洲论坛在线观看| 一区二区三区四区免费视频| 亚洲&#228;v永久无码精品天堂久久 | 亚洲午夜在线电影| 亚洲免费人成在线视频观看| 国产偷v国产偷v亚洲高清| 曰批全过程免费视频在线观看无码 | 亚洲春色在线视频| 九九美女网站免费| 久久久久久亚洲Av无码精品专口| 一级毛片不卡片免费观看| 中文字幕亚洲色图| 毛色毛片免费观看| 国产亚洲欧美日韩亚洲中文色| 四虎永久成人免费| 精品一区二区三区免费观看| 亚洲精品综合一二三区在线| 中国xxxxx高清免费看视频| 亚洲永久中文字幕在线| 成年女人免费视频播放77777| 亚洲国产欧美国产综合一区 | 暖暖免费高清日本中文| 曰批全过程免费视频观看免费软件| 2048亚洲精品国产| 黄色网址在线免费| 亚洲国产电影在线观看| 日本人护士免费xxxx视频| 特黄特色的大片观看免费视频| 亚洲国产精品一区二区久久hs | 九九综合VA免费看| 亚洲国产成人一区二区精品区| 99无码人妻一区二区三区免费 | 噜噜综合亚洲AV中文无码| 亚洲中文字幕第一页在线| 日本免费在线观看| 亚洲精品无码专区在线| 亚洲欭美日韩颜射在线二| 亚在线观看免费视频入口| 国产免费131美女视频| 亚洲视频在线观看地址|