深入理解AOP (读SpringGuide随笔)<o:p></o:p>
前言:最近2年一阵春(Spring)风吹变了世界各地,当然也把俺吹的昏头转向(差点没吹趴下,这那里是春风啊,简直就是头骨的阴风,:( ),故写一篇小文来迎接一哈这阵阵春风,希望对学习Spring的人,有一些帮助。好那,不说废话那,进入正题。
<o:p> </o:p>
Spring 中提供的AOP支持,是基于动态的AOP机制实现的。
这里什么是动态的的AOP呢?
即通过动态的Proxy模式,在目标对象的方法调用的前后插入相应的处理代码。
那么是么是动态的Proxy模式呢?
在Spring中的动态Proxy模式,是基于Java Dynamic Proxy(面向Interface)和CGLIB(面向Class)的实现。
那什么是Dynamic Proxy是JDK1.3版本中引入的一种动态代理机制。它是Proxy模式的一种动态实现版本。
而Proxy模式又分为两种
A:静态Proxy模式
B:动态Proxy模式
首先我们来看看什么是静态Proxy模式
假设我们有一个UserDAO接口以及一个实现类UserDAOImp
UserDAO.Java
Public interface UserDAO{
Public void saveUser(User user);
}
UserDAOImp.java
Public class UserDAOImp implents UserDAO{
Public void saveUser(User user){
………………………
}
}
<o:p> </o:p>
UserDAOProxy.java
Public class UserDAOProxy implments UserDAO{
//可以看到代理UserDAOProxy也是实现那UserDAO
· //
UserDAOProxy instanceof
UserDAO 将返回TRUE
<o:p> </o:p>
Private UserDAO userDAO;
Public UserDAOProxy(UserDAO userDAO){
This.userDAO= userDAO;
}
Public void saveUser(User user){
Transaction tx =null;<o:p></o:p>
Try{<o:p></o:p>
Tx=new Transaction();<o:p></o:p>
UserDAO.saveUser(user);
}catch(Excption e){<o:p></o:p>
Tx.rollBack();<o:p></o:p>
}<o:p></o:p>
}
}
当外部调用UserDAO或UserDAOImp的saveUser方法的时候,实际上是调用了UserDAOProxy的saveUser方法
注意UserDAOProxy同样也实现了UserDAO接口,对于调用者来说,saveuser方法的使用完全相同,不同的是内部的实现机制发生了一些改变,UserDAOProxy中为UserDAO.saveUser方法加了一层JTA事务管理的外壳。
好那,现在我们看看如何创建一个动态代理类的实例<o:p></o:p>
java.lang.reflect.Proxy用于Proxy
提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。<o:p></o:p>
创建某一接口 Foo
的代理:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class[] { Foo.class },
handler);
<o:p> </o:p>
public static Object newProxyInstance(ClassLoader loader,<o:p></o:p>
Class[] interfaces,<o:p></o:p>
InvocationHandler h)<o:p></o:p>
throws IllegalArgumentException<o:p></o:p>
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。此方法相当于: <o:p></o:p>
参数: <o:p></o:p>
loader - 定义代理类的类加载器 <o:p></o:p>
interfaces - 代理类要实现的接口列表 <o:p></o:p>
h - 指派方法调用的调用处理程序 <o:p></o:p>
返回: <o:p></o:p>
一个带有代理类的指定调用处理程序的代理实例,它由指定的类加载器定义,并实现指定的接口 <o:p></o:p>
动态代理类(以下简称为代理类)是一个实现在创建类时在运行时指定的接口列表的类。
代理接口 是代理类实现的一个接口。
代理实例 是代理类的一个实例。 每个代理实例都有一个关联的调用处理程序 对象
- 由于代理类将实现所有在其创建时指定的接口,所以对其 Class 对象调用 getInterfaces 将返回一个包含相同接口列表的数组(按其创建时指定的顺序),对其 Class 对象调用 getMethods 将返回一个包括这些接口中所有方法的 Method 对象的数组,并且调用 getMethod 将会在代理接口中找到期望的一些方法。 <o:p></o:p>
每个代理实例都有一个关联的调用处理程序,它会被传递到其构造方法中。静态 Proxy.getInvocationHandler
方法将返回与作为其参数传递的代理实例相关的调用处理程序。
public interface InvocationHandler{
Object invoke(Object proxy,
Method method,
Object[] args)
throws Throwable}
参数: <o:p></o:p>
proxy - 在其上调用方法的代理实例 <o:p></o:p>
method - 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。 <o:p></o:p>
args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
Spring的 HibernateDaoSupport 基类提供了访问与当前事务绑定的 Session 对象的函数,因而能保证在这种情况下异常的正确转化。类似的函数同样可以在 SessionFactoryUtils 类中找到,但他们以静态方法的形式出现。 值得注意的是,通常将一个false作为参数(表示是否允许创建)传递到 getSession(..) 方法中进行调用。 此时,整个调用将在同一个事务内完成(它的整个生命周期由事务控制,避免了关闭返回的 Session 的需要)。 <o:p></o:p>
public class ProductDaoImpl extends HibernateDaoSupport implements ProductDao {<o:p></o:p>
<o:p> </o:p>
public Collection loadProductsByCategory(String category)<o:p></o:p>
throws DataAccessException, MyException {<o:p></o:p>
<o:p> </o:p>
Session session = getSession(getSessionFactory(), false);<o:p></o:p>
try {<o:p></o:p>
List result = session.find(<o:p></o:p>
"from test.Product product where product.category=?",<o:p></o:p>
category, Hibernate.STRING);<o:p></o:p>
if (result == null) {<o:p></o:p>
throw new MyException("invalid search result");<o:p></o:p>
}<o:p></o:p>
return result;<o:p></o:p>
}<o:p></o:p>
catch (HibernateException ex) {<o:p></o:p>
throw convertHibernateAccessException(ex);<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
这种直接使用Hibernate访问代码的主要好处在于它允许你在数据访问代码中抛出checked exception,而 HibernateTemplate 却受限于回调中的unchecked exception。 注意,你通常可以将这些应用程序的异常处理推迟到回调函数之后,这样,你依然可以正常使用 HibernateTemplate。 一般来说,HibernateTemplate 所提供的许多方法在许多情况下看上去更简单和便捷。 <o:p></o:p>
声明式的事务划分<o:p></o:p>
分享到:
相关推荐
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...
Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过插入切面来增强或改变程序的行为。在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型...
Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...
现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...
Spring框架作为Java开发领域的领头羊之一,提供了强大的AOP支持。本文旨在深入探讨Spring AOP的核心概念及其原理。 #### 二、AOP基本概念 AOP是一种编程范式,其目的是提高模块化程度,特别是将那些对很多类都具有...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的可复用性和可维护性。 ### 1. ...
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理等。在Java应用中,AOP通过代理模式实现了切面编程,使得我们可以将业务逻辑...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,用于实现横切关注点的模块化。它允许开发者定义“切面”,将那些与业务逻辑无关,却为多个对象共有的行为(如日志、...
Spring AOP 和 Spring IOC 是 Spring 框架的两个核心组件,它们对于任何基于 Java 的企业级应用开发都至关重要。Spring AOP(面向切面编程)允许开发者在不修改源代码的情况下,通过“切面”来插入新的行为或增强已...
在`springAop1`这个压缩包中,可能包含了一个简单的应用示例,展示了如何定义一个切面类,以及如何在该类中定义通知方法。例如,我们可能会看到一个名为`LoggingAspect`的类,其中包含了`@Before`注解的方法,用于在...
通过以上介绍,我们可以看到Spring AOP的强大之处在于它简化了代码的组织和维护,使得横切关注点的实现更加优雅。了解并掌握这些概念,开发者可以有效地利用Spring AOP提升应用程序的可维护性和可扩展性。
"spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨Spring AOP、相关jar文件以及它们在实际开发中的作用。 首先,我们来看一下提供的文件: 1. aopalliance.jar:这是一...
Spring AOP,即Spring的面向切面编程模块,是Spring框架的重要组成部分,它允许开发者在不修改源代码的情况下,对程序进行横切关注点的处理,如日志、事务管理等。实现这一功能,主要依赖于三个核心的jar包:aop...
Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。