AOP简介
OOP思想对现代编程产生了深远的影响,但在某些方面,OOP也有其不足之处。比如在logging(日志)、transaction(事务)等方面,应用OOP将这些内容封装为对象的行为则会产生大量的代码重复,虽然通过一些设计模式可以减少这种重复,但我们还有更好的解决办法,那就是AOP(Aspect Oriented Programming)。AOP是最近兴起的一种编程思想,它是OOP思想的补充,而不是其对立面。
AOP,从字面的理解来看就是面向切面的编程,用一个比较通俗的例子来说,比如在访问多个对象前需要进行权限检查,那么如果按照面向对象的思路来说,权限检查势必会成为这多个对象的行为。如果每个对象都需要去实现这些行为,势必会造成大量重复代码的产生,写程序也会变得枯燥无味。但我们可以将权限检查看作是一个切面,所有对这些对象的访问都要经过这个切面。要了解AOP,就必须先了解几个基本的且非常重要的概念。
Aspect(切面):对象操作过程中的截面。如权限检查、日志、事务处理等。
Join Point(连接点):程序运行中的某个阶段点。如某个方法调用,异常抛出等。
Advice(处理逻辑):某个连接点所采用的处理逻辑。
PointCut(切点):一系列连接点的集合,它指明Advice在什么时候被触发。
示例
还是用例子来说明一切,比如现在有一个DomainObjDAO接口以及其实现类DomainObjDAOImpl
DomainObjDAO.java:
public interface DomainObjDAO {
public void save();
}
DomainObjDAOImpl:
public class DomainObjDAOImpl implements DomainObjDAO {
private Logger logger = Logger.getLogger(this.getClass().getName());
public void save() {
System.out.println("saving domain object......");
}
现在需要在save方法中添加对该业务对象的锁,比如在save前后加锁和解锁。拿到这个需求,在不影响外部调用逻辑以及不对现有代码改动的前提下,Proxy模式(GOF)是个不错的选择,新增一个Proxy类同样实现DomainObjDAO接口,在其实现方法中代理DomainObjDAOImpl类的save方法,并在save的前后调用lock以及unlock方法。这种方法使得我们不必改动外部调用逻辑以及现有代码,但是如果有多个DomainObjImpl的情况下,该方法的弊端便暴露无遗,我们必须实现与DomainObjImpl个数相同的Proxy类来实现该功能,这对我们来说将是非常恐怖且不可接受的。
这个例子再次印证我们开始所描述的,针对这类问题,OOP显得有些力不从心,而AOP却能很好的解决它,JDK1.3后所提供的动态代理的特性为我们利用AOP的思想解决这个问题提供了很好的思路,下面我们来看它如何实现。
动态代理实现AOP
public class LockHandler implements InvocationHandler {
private Logger logger = Logger.getLogger(this.getClass().getName());
private Object originalObject;
public Object bind(Object obj) {
logger.info("coming here...");
this.originalObject = obj;
return Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),this);}
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
Object result=null;
if(arg1.getName().startsWith("save")){
lock();
result=arg1.invoke(this.originalObject,arg2);
unlock();
}
return result;
}
private void lock(){
logger.info("lock object...");
}
private void unlock(){
logger.info("unlock object...");
}
}
上述代码中并没有出现与具体应用层相关的接口以及类的引用,所以对所有的类都适用。这便解决了用普通Proxy类实现的弊端。但是动态代理要求所代理的类必须是某个接口的实现(这点可以通过obj.getClass().getInterfaces()看出),不过这也符合面向对象的设计思想,如果所代理的类没有实现任何接口,可以通过GCLIB来实现,这里就不再详述。
最后我们写下一个TestCase来测试动态代理的实现,如下:
public class DyproxyTestCase extends TestCase {
private LockHandler handler=null;
private DomainObjDAOImpl daoImpl=null;
protected void setUp() throws Exception {
// TODO Auto-generated method stub
super.setUp();
handler=new LockHandler();
daoImpl=new DomainObjDAOImpl();
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testSave(){
((DomainObjDAO)handler.bind(daoImpl)).save();
}
}
运行结果如下:
2004-12-1 23:01:10 test.aop.dynamicproxy.LockHandler bind
信息: coming here...
2004-12-1 23:01:10 test.aop.dynamicproxy.LockHandler lock
信息: lock object...
saving domain object......
2004-12-1 23:01:10 test.aop.dynamicproxy.LockHandler unlock
信息: unlock object...
至此,我们用动态代理实现了AOP,Spring的AOP实现正是采用了动态代理,我将在下一个Blog中讨论其实现。
分享到:
相关推荐
Spring 2.5 AOP(面向切面编程)是Java应用程序中的一个重要概念,它允许开发者在不修改原有代码的情况下插入新的行为或监控。这个例子旨在帮助我们理解和应用Spring框架的AOP特性。以下是对该主题的详细解释: 一...
在Spring AOP中,这个对象通常是业务逻辑实现类。 7. **AOP代理(AOP Proxy)**:由AOP框架创建的对象,用于包含通知逻辑。Spring提供了两种类型的代理:JDK动态代理和CGLIB代理。 8. **编织(Weaving)**:是指将...
理解和掌握AOP的概念及其在Spring框架中的实现方式,包括基于XML和注解的配置方式,以及JDK动态代理和CGLIB代理的原理和使用。通过学习,应能独立实现AOP相关的功能,提升代码的可扩展性和可维护性。
在Spring AOP中,我们通过定义切面(Aspect)来封装这些横切关注点,从而达到代码复用和解耦的目的。类图是理解这一概念的关键,通过类图,我们可以清晰地看到各个组件之间的关系。 1. **切面(Aspect)**:切面是...
8. **org.springframework.asm-3.0.5.RELEASE.jar**:这个库提供了对Java字节码的读取、修改和生成的功能,Spring AOP在动态代理过程中可能会用到。 9. **aopalliance-1.0.jar**:AOP Alliance是AOP框架间的一个互...
在这个“Spring AOP 1.0示例”中,我们重点关注如何在实际项目中应用这一特性。 首先,我们需要了解AOP的基本概念。AOP的核心思想是将那些影响多个类的公共行为(如日志记录)抽取出来,形成独立的模块,称为切面...
**Spring AOP 使用实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不...在实际开发中,合理地运用Spring AOP,可以显著提高项目的质量和开发效率。
在IT行业中,Spring框架是Java开发中的核心工具之一,尤其在企业级应用开发中,它的影响力不可忽视。本文将深入探讨Spring 3.0.5版本中的AOP(面向切面编程)特性,以及如何使用它来提升代码的可维护性和模块化。AOP...
### 企业级面向切面编程(AOP)与Spring框架 #### 一、Spring框架概述...通过学习Spring AOP,开发者不仅能够编写更加清晰、可维护的代码,还能够在实际项目中充分利用Spring框架的强大功能,提高软件开发效率和质量。
压缩包中的“lib (1)”很可能包含了所有这些必要的jar文件,确保了开发者可以快速搭建一个支持Spring和AOP的开发环境,进行基础的Spring应用开发。 总的来说,这个“Spring+AOP全套jar包”是一个非常实用的开发资源...
Spring框架是Java开发中不可或缺的一部分,它主要由两个核心组件构成:IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。本笔记将深入探讨这两个概念以及它们在Spring中...
通过分析这些文件,我们可以更深入地理解如何在实际项目中应用Spring AOP。 总结来说,Spring AOP提供了一种优雅的方式,让我们能够将横切关注点与核心业务逻辑分离,从而提高代码的可维护性和可扩展性。通过理解和...
1. **Spring-AspectJ集成:**本书重点介绍了Spring框架与AspectJ相结合的技术优势及其在企业级应用中的强大功能。 2. **面向切面编程(AOP):**深入探讨了AOP的概念、原理及其实现方式,特别是如何利用AspectJ进行...
Spring AOP,全称为Spring面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对现有代码进行增强的技术,以实现程序功能的统一控制。AOP的主要目的是降低业务逻辑各部分之间的耦合度...
在Spring AOP中,我们可以通过定义切面(Aspect)来封装横切关注点,即那些跨越多个对象的业务逻辑,如日志、安全控制等。这些关注点可以被模块化,并在运行时自动插入到目标对象中,而无需修改原有代码。 在Spring...
Spring框架是Java开发中的核心组件,它通过控制反转(IOC)和面向切面编程(AOP)等特性,极大地简化了企业级应用的构建。...实践这些例子,对于理解Spring框架的工作原理及其在实际项目中的应用至关重要。
1、按图所示的类图结构,设计接口及其实现类,并完成另外两附加要求:(1)日志功能:在程序执行期间追踪正在发生的活动(打印出调用的方法,以及参数的参数值);(2)验证功能:希望计算器只能处理正数的运算,当...
- 在Spring AOP中,连接点通常是方法调用。 **4. Pointcut (切入点)** - 定义:匹配连接点的表达式,用于指定通知应用的时机和目标对象。 **5. Target (目标对象)** - 定义:将要被代理的对象,通常是业务逻辑接口...
在这个特定的场景中,我们聚焦于Spring框架中的AOP(面向切面编程)标签支持,这在SSH项目开发中扮演着至关重要的角色。 Spring的AOP模块提供了一种灵活的机制,允许我们在不修改现有代码的情况下,插入额外的功能...
Spring AOP(面向切面编程)是Spring框架中的一个关键模块,它为开发者提供了在应用程序中实现横切关注点(Cross-cutting Concerns)的能力。横切关注点是指那些几乎贯穿整个应用的公共关注点,例如日志记录、性能...