`
liuye
  • 浏览: 53986 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

AOP和Spring事务处理

    博客分类:
  • java
阅读更多

一.为什么要用框架和模式

1.为什么要用模式?

因为模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你作出一个优良的设计方案,达到事半功倍的效果。而且会得到解决问题的最佳办法。

2.为什么要用框架?

因 为软件系统发展到今天已经很复杂了,特别是服务器端软件,设计到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础 工作,你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事物处理,安全性,数据流控制等问题。 还有框架一般都经过很多人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,你可以直接享受别人升级代码带来的好处。
总之:就是让开发更简单,让我们成功


二. AOP

1. AOP是什么?
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。

2. 切面意义何在?
就 可以在这层切面上进行统一的集中式权限管理。而业务逻辑组件则无需关心权限方面的问题。也就是说,通过切面,我们可以将系统中各个不同层次上的问题隔离开 来,实现统一集约式处理。各切面只需集中于自己领域内的逻辑实现。这一方面使得开发逻辑更加清晰,专业化分工更加易于进行;另一方面,由于切面的隔离,降 低了耦合性,我们就可以在不同的应用中将各个切面组合使用,从而使得代码可重用性大大增强。

3. AOP应用范围

Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging  调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence  持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务


三.Spring事务处理

1.Spring事务管理能给我们带来什么?

对 于传统的基于特定事务资源的事务处理而言(如基于JDBC 的数据库访问),Spring并不会对其产生什么影响,我们照样可以成功编写并运行这样的代码。同时,Spring还提供了一些辅助类可供我们选择使用, 这些辅助类简化了传统的数据库操作流程,在一定程度上节省了工作量,提高了编码效率。

对于依赖容器的参数化事务管理而言,Spring则 表现出了极大的价值。Spring本身也是一个容器,只是相对EJB容器而言,Spring显得更为轻便小巧。我们无需付出其他方面的代价,即可通过 Spring实现基于容器的事务管理(本质上来讲,Spring的事务管理是基于动态AOP)。

2. Hibernate in Spring
applicationContext.xml

<!-- Hibernate SessionFactory -->
<bean id="sessionFactory“   class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
                <property name="dataSource"><ref local="dataSource" /></property>
                <property name="mappingResources">
                        <list><!-- Add list of .hbm.xml files here -->
                                <value>org/mzone/model/Tuser.hbm.xml</value>
                                <value>org/mzone/model/Article.hbm.xml</value>
                        </list>
                </property>
                <property name="hibernateProperties">
                        <props>
                                <prop         key="hibernate.dialect">net.sf.hibernate.dialect.SybaseDialec</prop>
                                <prop key="hibernate.show_sql">True</prop>
                        </props>
                </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>        
        <bean id="baseTxProxy" lazy-init="true"         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
        <property name="transactionManager"><ref bean="transactionManager"/></property>
           <property name="target">
                   <ref local=" userManagerTarget " />
            </property> 
        <property name="transactionAttributes"> 
            <props>
                            <prop key="save*">PROPAGATION_REQUIRED</prop>
                        <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                        <prop key="remove*">PROPAGATION_REQUIRED</prop> 
                        <prop key="*">PROPAGATION_REQUIRED</prop> 
            </props> 
        </property> 
    </bean> 
    <bean id="userManagerTarget" class="org.mzone.service.impl.UserManagerImpl">
        <property name="userDAO"><ref local="userDAO"/></property>
        <property name="articleDao"><ref local="articleDAO"/></property>
    </bean>





UserDAO.java        ArticleDAO.java

public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {
        public void saveUser(Tuser user) {
        getHibernateTemplate().saveOrUpdate(user);
        }
}
public class ArticleDAOImpl extends HibernateDaoSupport implements ArticleDAO {
        public void saveArticle(Article article) {
                getHibernateTemplate().saveOrUpdate(article);
        }
}



HibernateDaoSupport
  实 现了HibernateTemplate和SessionFactory实例的关联。HibernateTemplate对Hibernate Session操作进行了封装,而HibernateTemplate.execute方法则是一封装机制的核心,感兴趣可以研究一下其实现机制。
        借助HibernateTemplate我们可以脱离每次数据操作必须首先获得Session实例、启动事务、提交/回滚事务以及烦杂的try/catch/finally的繁琐操作。从而获得以上代码中精干集中的逻辑呈现效果。


org.mzone.service.impl.UserManagerImpl

public class UserManagerImpl implements UserManager {
        private UserDAO userDao;
    private ArticleDAO articleDao;    

    public void saveUserAndArticle(Tuser user, Article article) {
        userDao.saveUser(user);
        articleDao.saveArticle(article);        
    }

}




测试代码

InputStream is = new FileInputStream("applicationContext.xml");
XmlBeanFactory factory = new XmlBeanFactory(is);
UserManager userManager =         (UserManager )factory.getBean(" baseTxProxy ");
 
 user = new Tuser();
 article = new Article();
 user.setUsername("hellboys_topic 1");
 user.setPassword("12345678_topic 1");
 article.setTitle("hellboys_topic 1");
 article.setContent("hellboys_topic 1");        
 userManager.saveUserAndArticle(user,article);




注意问题

UserManager userManager =         (UserManager )factory.getBean(" baseTxProxy ");

UserManager userManager = 
                        (UserManagerImpl) ctx.getBean("baseTxProxy");
java.lang.ClassCastException



原 因在于Spring的AOP实现机制,前面曾经提及,Spring中的事务管理实际上是基于动态AOP机制实现,为了实现动态AOP,Spring在默认 情况下会使用Java DynamicProxy,但是,Dynamic Proxy要求其代理的对象必须实现一个接口,该接口定义了准备进行代理的方法。而对于没有实现任何接口的Java Class,需要采用其他方式,Spring通过CGLib10实现这一功能。
CGLib可以在运行期对Class行为进行修改。由于其功能强大,性能出众,常常被作为Java Dynamic Proxy
之外的动态Proxy模式的实现基础。在Spring、Hibernate中都用到了CGLib类库。


参考读物
Opendoc系列《Spring 开发指南》
Spring Reference: http://www.springframework.org/
AOP联盟: http://aopalliance.sourceforge.net/
Matt Raible《Spring Live》
开源项目 Appfues

分享到:
评论

相关推荐

    aop与spring事务处理

    ### AOP与Spring事务处理详解 #### 一、引言:为什么使用框架和设计模式? 在软件开发领域,设计模式和框架是两个重要的概念。设计模式作为一种指导思想,能够帮助开发者更好地解决常见的软件设计问题,确保系统...

    Java框架技术 Spring 学习案例 Spring AOP案例和Spring事务处理案例

    本教程主要聚焦于Spring框架的两大核心特性:Spring AOP(面向切面编程)和Spring事务处理,通过具体的应用案例来深入理解这两个概念。 首先,让我们详细探讨Spring AOP。AOP是面向切面编程的缩写,它允许程序员...

    spring基于AOP实现事务

    对于Spring事务管理,我们通常有两种方式:编程式和声明式。编程式事务管理需要在代码中显式地调用begin、commit、rollback等事务控制方法,而声明式事务管理则是在配置文件或注解中声明事务规则,更加简洁且易于...

    Spring AOP配置事务方法

    Spring AOP 提供了一种灵活的方式来实现事务管理,通过配置事务特性和事务管理切面来实现事务管理。 配置事务管理切面: 在 Spring AOP 中,事务管理切面是通过 `&lt;aop:config&gt;` 元素来配置的。该元素用于定义一个...

    Spring相关的笔记,包含ioc、DI、AOP、Spring事务等等

    这份笔记涵盖了Spring的核心概念和技术,包括IOC(Inverse of Control,控制反转)、DI(Dependency Injection,依赖注入)、AOP(Aspect Oriented Programming,面向切面编程)以及Spring事务管理。以下是对这些...

    Spring aop、jdbc和事务tx练习

    通过这些练习,你可以深入理解Spring如何整合AOP、JDBC和事务管理,并提升你的实际开发技能。在实践中,你可能会遇到的问题包括事务传播行为、异常回滚规则、事务隔离级别等,这些都是进一步学习和研究的方向。

    java springAOP 事务+注释

    2. **Spring事务管理** 在Spring中,事务管理分为编程式和声明式两种。编程式事务管理需要在代码中显式地调用开始、提交、回滚等事务操作,而声明式事务管理则更简洁,通过配置或者注解即可实现,降低了代码的耦合...

    spring-boot aop

    在Spring框架中,AOP主要用于日志记录、事务管理、性能统计等场景。本示例是关于如何在Spring Boot项目中实现AOP功能的一个简单演示。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越...

    springioc和spring aop

    **面向切面编程(AOP)**是Spring的另一个关键特性,它允许开发者定义横切关注点,这些关注点可以是日志记录、事务管理、性能度量等跨多个类或方法的功能。AOP的核心是切面(Aspect)、连接点(Join Point)、通知...

    Spring IOC和Spring AOP_spring aop_springIOC

    在实际开发中,Spring AOP常用于事务管理,通过声明式事务管理,开发者可以在配置文件或注解中定义事务规则,无需在业务代码中显式处理事务。 综上所述,Spring的IOC和AOP提供了强大的工具,帮助开发者实现松耦合、...

    springAop与spring定时器

    Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,通过在程序运行时动态地将代码插入到方法调用中,来实现跨切面的关注点,如日志记录、性能监控、事务管理等。而Spring...

    SpringAOP整合Hibernate并使用事务(模拟买书的过程)

    这个过程将涉及到数据库操作,事务的开始、提交和回滚,以及AOP在处理事务中的作用。 首先,Spring AOP是Spring框架的一部分,它允许我们定义横切关注点,如日志记录、性能监控或事务管理,这些关注点可以被模块化...

    mybatis 拦截器 + spring aop切面 + spring事务+ 反射工具类

    在IT行业中,MyBatis、Spring AOP、Spring事务管理和反射工具类是常见的技术栈,它们在构建高效、灵活的企业级应用中起着至关重要的作用。以下是对这些知识点的详细阐述: 1. MyBatis拦截器(MyBatis Interceptor)...

    spring aop和事务练习

    spring中aop和Synchronized锁在Spring事务管理下,导致线程不安全。

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    本篇文章将重点讨论如何在Spring框架中集成Hibernate,并探讨编程式事务管理和Spring AOP的声明式事务。 首先,让我们理解Spring与Hibernate的集成。为了整合这两个库,你需要在Spring配置文件中定义Hibernate的...

    Spring及AOP应用(事务与集成)培训

    总的来说,这次“Spring及AOP应用(事务与集成)培训”将全面覆盖Spring框架在事务处理和集成方面的核心知识,帮助开发者提升技能,更好地应对复杂的企业级应用开发挑战。通过深入学习和实践,你将能够熟练掌握Spring...

    基于注解配置和使用spring AOP(spring mvc框架)

    在Spring MVC中,AOP常用于处理全局异常、事务管理和安全控制。例如,你可以创建一个异常处理切面,捕获所有控制器方法抛出的异常并统一处理: ```java @Aspect public class ExceptionHandlingAspect { @...

    spring 事务管理例子(TransactionProxyFactoryBean代理机制 和 tx/aop)

    在`tx`和`aop`的配合下,Spring会通过AOP代理拦截带有`@Transactional`的方法调用,根据注解中的配置启动一个新的事务,执行方法,如果方法正常结束则提交事务,遇到异常则回滚事务。 在基于Struts1.2和Spring2.0的...

    使用Spring的注解方式实现AOP的细节

    在Spring框架中,面向切面编程(AOP)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限控制等,这些关注点可以被模块化并独立于业务逻辑进行处理。本篇文章将深入探讨如何通过Spring的注解...

    第五章:Spring AOP 在 Spring Framework 内部应用1

    接下来,我们深入到Spring AOP在Spring事务(Transactions)的应用。Spring提供了强大的事务管理机制,包括@EnableTransactionManagement注解来启用事务管理,以及@Transactional注解用于标记需要进行事务控制的方法...

Global site tag (gtag.js) - Google Analytics