`

Spring Framework之最佳实践

阅读更多

来源:http://www.gpowersoft.com/tech/Spring/45.htm

 

Spring Framework从诞生之日起,受到了越来越多的关注。最近,新的开源项目大多支持Spring Framework。国内目前也有专门的网站(http://spring.jactiongroup.net/)。那它为什么如此受欢迎呢?

我想最重要的是,EJB让每个人都痛恨。要编写一个EJB,需要写LocalHome, RemoteHome, Bean, LocalInterface, RemoteInterface,需要一个标准描述符,一个特殊厂商描述符(Weblogic、WebSphere都不一样),如果是Entity Bean,还需要Mapping文件。如此之多,实在麻烦。但EJB最重要的是解决Transaction问题,没有Spring之前,没有其他方法能够描述式的解决它。每个人、每个公司为了解决Transaction的问题,编程的写法都不一样,百花齐放。于是,在最需要它的时候,Spring出现了。

Spring的功能非常多。但对于一个产品,最重要的是如何用好它的精华。Spring包含AOP、ORM、DAO、Context、Web、MVC几个部分组成。Web、MVC暂不用考虑,用成熟的Struts、JSP或Webwork更好。DAO由于目前Hibernate、JDO的流行,也可不考虑。因此最需要用的是AOP、ORM、Context。

Context中,最重要的是Beanfactory,它是将接口与实现分开,非常重要。以前我们写程序,如一个接口IDocument,一个实现类Document1。在写程序时,需写成IDocument doc = new Document1(),一旦我们的实现类需改变时,变为Document2,则程序需写成IDocument doc = new Document2(),所有用到的地方全需改。Beanfactory帮我们解决了这个问题,用context后,写法变为IDocument doc=(IDocument)beanFactory.getBean("doc")。如果实现类从Document1改为Document2,直接在配置文件改就可以了。Context是Bean factory的进一步抽象。很多人都喜欢用ApplicationConext,用Servlet把它Load。这样就把Bean Factory与Web绑定在一起。如果是Fat Client或Remote调用,则这些Bean factory就很难调用,实际是将表现层与业务层绑定的太紧。推荐的方法是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>


这样,就可随时动态扩展,实现组件式的开发。

Spring Framework最得以出名的是与Hibernate的无缝链接,基本上用Spring,就会用Hibernate。可惜的是Spring提供的HibernateTemplate功能显得不够,使用起来也不是很方便。我们编程序时,一般先写BusinessService,由BusinessService调DAO来执行存储,在这方面Spring没有很好的例子,造成真正想用好它,并不容易。

我们的思路是先写一个BaseDao,仿照HibernateTemplate,将基本功能全部实现:

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,专门负责一般实体的基本操作,会更方便。

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实体实现基本的增加、修改、删除、查询等。

其它的BusinessService就可以继承EntityManager,快速实现业务逻辑。

具体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 Framework v6.1.4.zip

    通过阅读源码,可以学习到设计模式、最佳实践以及如何编写高质量的Java代码。同时,对于想要自定义或扩展Spring功能的开发者,源码分析也极具价值。 总的来说,Spring Framework v6.1.4是一个强大的工具,不仅提供...

    Spring Framework v5.3.32.zip

    在下载并解压"spring-framework-5.3.32"后,开发者通常会查看源码,了解其内部工作原理,学习最佳实践,或者用于毕业设计项目中,以掌握现代企业级Java应用开发的核心技术。同时,这个版本的更新日志可能会包含重要...

    spring-framework-5.3.8

    在 5.3.8 版本中,测试工具和库可能已经升级,以适应新的测试框架和最佳实践。 8. **模块化**:Spring Framework 5.3.8 继续沿用了模块化设计,允许开发者根据需求选择引入必要的模块,降低项目的体积和启动时间。 ...

    官方源码 spring-framework-5.3.4.zip

    通过对Spring Framework 5.3.4源码的深入学习,开发者不仅可以提升自己的技术能力,还能了解到更多设计原则和最佳实践。这将有助于在实际项目中编写出更高效、可维护的代码,同时也能更好地参与到Spring社区的发展中...

    spring-framework-5.3.20

    《Spring Framework 5.3.20:深度解析与应用...无论是传统的MVC模式,还是新兴的反应式编程,都能在Spring的怀抱中找到最佳实践。通过深入了解和熟练掌握Spring,开发者能够创建出高效、灵活且易于维护的企业级应用。

    spring-framework-4.3.30.RELEASE-dist.zip

    对于学习和理解Spring框架的用法、配置以及最佳实践至关重要。通过阅读这些文档,开发者可以了解到Spring的核心概念、模块结构、配置方式以及如何将Spring集成到实际项目中。 2. **libs文件夹**:包含了一系列的jar...

    spring framework离线文档

    对于更现代的应用场景,Spring 4.1.0的英文参考文档(spring-framework-reference(4.1.0).pdf)会是宝贵的资源,它详细介绍了框架的高级特性和最佳实践。 在实际项目中,可以逐步学习并实践Spring MVC、数据访问、...

    SpringFrameWork 5.3.6.zip

    通过学习和实践Spring Framework 5.3.6,开发者可以掌握现代Java应用开发的最佳实践,包括模块化架构、声明式编程、反应式编程等。同时,Spring的广泛生态系统,如Spring Boot、Spring Cloud等,为构建微服务架构...

    官方原版完整包 spring-framework-5.3.3.RELEASE.zip

    Spring Framework 5.3.3 是一个广泛应用的Java企业级应用程序开发框架,它以其模块化设计、灵活性和强大的功能而闻名。...总的来说,Spring Framework 5.3.3 是一个强大且全面的工具集,是Java开发者的首选框架之一。

    spring-framework-bom源码

    Spring Framework 是一个广泛使用的Java应用程序开发框架,它提供了一个全面的编程和配置模型,促进了良好的编程实践和结构化的应用开发。...同时,这也是一次学习设计模式、编程原则和最佳实践的好机会。

    官方原版源码spring-framework-5.1.4.RELEASE.zip

    《Spring Framework 5.1.4源码深度解析》 Spring Framework是Java开发中的核心框架,它为构建高质量的企业级应用提供了全面的...通过深入研究源码,我们可以学习到软件设计的最佳实践,提升我们的编程技巧和架构能力。

    spring-framework-5.2.25.RELEASE.tar.gz

    无论是对框架内部机制的探究,还是对最佳实践的学习,都能从源码中找到答案。因此,对于任何致力于提升自身技术水平的Java开发者来说,Spring Framework 5.2.25.RELEASE的源码分析都是一个不容错过的学习资源。

    官方原版spring-framework-4.3.18.RELEASE.zip

    这些文档是开发者学习和理解Spring功能、最佳实践以及如何解决常见问题的重要资源。通过阅读文档,开发者可以深入了解Spring MVC、数据访问、事务管理、测试等模块的使用方法。 "spring-framework-4.3.18.RELEASE-...

    Spring Framework开发中文参考文档

    Spring Framework是中国广大Java开发者在进行企业级应用开发时不可或缺的框架工具。该框架以其轻量级、模块...开发者可以通过阅读这份文档,深入学习Spring的各种特性和最佳实践,从而提升其在Java开发领域的专业技能。

    spring-framework-5.0.2.RELEASE 源码包

    深入研究Spring Framework 5.0.2.RELEASE的源码,开发者可以了解其实现细节,学习如何利用设计模式来构建可扩展和灵活的应用,同时也能掌握Java世界中的最佳实践。源码阅读有助于提升开发者的技术深度,为解决复杂...

    官方原版完整包 spring-framework-5.0.19.RELEASE.zip

    6. **文档资源**:压缩包内的`spring-framework-5.0.19.RELEASE-docs.zip`包含了详尽的官方文档,帮助开发者了解框架的使用方法和最佳实践,是学习和使用Spring Framework不可或缺的参考资料。 7. **XML与Java配置*...

    电子书-Spring Framework 开发参考手册

    《Spring Framework 开发参考手册》是一本专注于Java开发者的权威指南,主要涵盖了Spring框架的核心概念、配置、使用方法以及最佳实践。Spring作为Java生态系统中的重要组成部分,为开发者提供了丰富的功能,包括...

    spring-framework-4.2.2.RELEASE

    文档通常会涉及配置、代码示例、最佳实践,以及解决问题的策略。 需要注意的是,由于文档内容是通过OCR扫描识别获得的,某些地方可能会有错别字或者识别错误,这需要读者根据上下文以及自身对Spring Framework的...

    Spring Framework 4.1.0参考文档

    总的来说,Spring Framework 4.1.0参考文档详细介绍了Spring Framework各个方面的知识,从基础概念到高级特性,从模块划分到应用最佳实践,为开发者提供了全面的学习资源和指导。希望以上的详细知识点能够为使用...

    Spring Framework 开发参考手册.rar

    以上只是《Spring Framework 开发参考手册》的部分内容概览,实际手册中会有更详细的API介绍、示例代码和最佳实践指导,对于任何希望掌握Spring框架的开发者来说,都是一份不可或缺的学习资料。

Global site tag (gtag.js) - Google Analytics