`
javafenger
  • 浏览: 243350 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

AOP及其在Spring中的应用

阅读更多
 
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 AOP实验

    1、按图所示的类图结构,设计接口及其实现类,并完成另外两附加要求:(1)日志功能:在程序执行期间追踪正在发生的活动(打印出调用的方法,以及参数的参数值);(2)验证功能:希望计算器只能处理正数的运算,当...

    Spring AOP运用Spring AOP技术,要求包含前置通知、后置通知、环绕通知、返回通知、异常返回通知。

    1、编写切面类,包含权限审核方法和日志记录方法,这两个方法将来会织入到...5、编写案例,运用Spring AOP技术,要求包含前置通知、后置通知、环绕通知、返回通知、异常返回通知。请掌握这五种通知的特点,及应用场景

    aopalliance-1.0.jar

    aopalliance-1.0.jar是一个Java库,提供了一套AOP(面向切面编程)的接口和注解,这可以用于在Java应用程序中实现横切关注点的模块化。这个库是AOP联盟的一个开源项目,被广泛应用在许多Java应用程序和框架中。 AOP...

    spring-boot-starter.xmind

    spring-boot-starter-aop及其使用场景说明 spring-boot-starter-security与应用安全 spring-boot-starter-actuator与应用监控 资料是spring-boot-starter 常用模块进行详细内容的思维导图,整理好的,望采纳。

    Spring框架:深入解析、心得分享与实战应用

    在Spring框架中,开发者可以通过配置文件或注解的方式,定义和管理应用程序中的对象及其依赖关系。这使得对象之间的耦合度降低,提高了代码的可维护性和可扩展性。同时,Spring还提供了强大的事务管理、数据访问、...

    SSM框架面试题.pdf

    SSM框架,代表Spring、SpringMVC和MyBatis三个框架的组合,是Java企业应用开发中常用的技术栈。以下是涵盖SSM框架的60个面试问题清单,适用于准备面试的候选人。 ### Spring(1-20) 1. Spring框架中的核心概念是...

    spring security 参考手册中文版

    12.2.3使用RequestPostProcessor在Spring MVC测试中以用户身份运行 106 作为用户在Spring MVC测试中使用注释运行 108 12.2.4测试HTTP基本认证 109 12.3 SecurityMockMvcRequestBuilders 109 12.3.1测试基于表单的...

    20万字必备java面试八股文宝典-多线程.数据库.Spring.SpringBoot.Linux.分布式.设计模式.面试指导

    一份综合性的面试准备指南,旨在帮助Java开发者准备和应对...设计模式部分详细介绍了常用的设计模式及其在Java开发中的应用场景。 适合各阶段的Java开发者使用,旨在帮助大家在激烈的竞争中脱颖而出,获取理想的工作。

    Spring_notes

    Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用的配置和依赖性规范与实际的应用程序代码分开。 ...

    基于javaWeb实现计算机配件报价系统项目设计源码分享

    spring主要用来开发java应用,构建J2EE平台的web应用。其核心就是提供一种新的机制管理业务对象及其依赖关系 (2)spring的优点 容器:spring是一个容器,包含并管理对象的生命周期和配置。可以配置每个bean如何被...

    基于javaWeb实现计算机配件报价系统项目设计源码

    spring主要用来开发java应用,构建J2EE平台的web应用。其核心就是提供一种新的机制管理业务对象及其依赖关系 (2)spring的优点 容器:spring是一个容器,包含并管理对象的生命周期和配置。可以配置每个bean如何被...

    基于java实现仿京东商城电商系统项目设计与实现源码分享

    spring主要用来开发java应用,构建J2EE平台的web应用。其核心就是提供一种新的机制管理业务对象及其依赖关系 (2)spring的优点 容器:spring是一个容器,包含并管理对象的生命周期和配置。可以配置每个bean如何被...

    基于java实现仿京东商城电商系统项目设计与实现源码

    spring主要用来开发java应用,构建J2EE平台的web应用。其核心就是提供一种新的机制管理业务对象及其依赖关系 (2)spring的优点 容器:spring是一个容器,包含并管理对象的生命周期和配置。可以配置每个bean如何被...

    基于java实现大学生求职就业网项目设计源码分享

    spring主要用来开发java应用,构建J2EE平台的web应用。其核心就是提供一种新的机制管理业务对象及其依赖关系 (2)spring的优点 容器:spring是一个容器,包含并管理对象的生命周期和配置。可以配置每个bean如何被...

    基于java实现大学生求职就业网项目设计源码

    spring主要用来开发java应用,构建J2EE平台的web应用。其核心就是提供一种新的机制管理业务对象及其依赖关系 (2)spring的优点 容器:spring是一个容器,包含并管理对象的生命周期和配置。可以配置每个bean如何被...

    详解JSP 中Spring工作原理及其作用

    主要介绍了详解JSP 中Spring工作原理及其作用的相关资料,使用 AOP后,公共服务(比如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性,需要的朋友可以参考下

    SSH2-DEMO:Struts2+Hibernate+Spring Web 应用

    整个项目在以严谨着称的IntelliJ IDEA 进行开发&测试,部署在Jetty 服务器中,部分代码参考了国内开源的Jspxcms 系统,数据库方面则使用了国内最流行的MySQL 及其GUI Tools,并开源至GitHub 。 Web 前端部分运用最新...

    Java应用开发实验二.docx

    1、按图所示的类图结构,设计接口及其实现类,并完成另外两附加要求:(1)日志功能:在程序执行期间追踪正在发生的活动(打印出调用的方法,以及参数的参数值);(2)验证功能:希望计算器只能处理正数的运算,当...

    eclair:Java Spring库用于声明式日志记录

    埃克莱尔 Eclair-用于AOP日志记录的Java Spring库。 提供用于注释性方法执行的声明式日志记录的注释。 包括用于批注处理的抽象,... 实现基于标准的Spring代理及其所有后果和局限性。 带注释的能够记录执行的开始和

Global site tag (gtag.js) - Google Analytics