`

对AOP的理解

阅读更多
静态代理
   实际逻辑类注入到代理类
  生成代理类的对象,然后执行代理类同名的方法, 在这个方法里,代理类可以自己做一些操作.

动态代理
   生成一个代理类,然后将实现类注入进来,然后调用注入类的方法时执行业务逻辑.


Test.java 测试接口类
TestImpl.java 测试接口实现类
TestProxy.java 接口代理类
Tester.java 测试类,main方法所在类


package demo;
public interface Test {
   public void sayHello(String name);
}


package demo;
public class TestImpl implements Test {
  public void sayHello(String name) {
    System.out.println("Hello "+name);
  }
}

package demo;
import java.lang.reflect.*;
public class TestProxy implements InvocationHandler {
    Test iTest = null;
    public TestProxy(Test test) { this.iTest = test; }
    public Test getTest(){
        return(Test)Proxy.newProxyInstance(iTest.getClass().getClassLoader(),
                                           iTest.getClass().getInterfaces(),this);
    }
    public Object invoke(Object proxy, Method method, Object[] args)
          throws Throwable
    {
        System.out.println("Before invoke sayHello(\""+args[0]+"\")");
        Object rst = method.invoke(iTest,args);
        System.out.println("After invoke sayHello(\""+args[0]+"\")");
        return rst;
    }
}

package demo;
public class Tester {
    public static void main(String[] args) {
        getTest1().sayHello("JAVA接口代理");
        System.out.println("====================");
        getTest2().sayHello("JAVA接口代理");
    }
    private static Test getTest1(){
        return new TestImpl();
    }
    private static Test getTest2(){
        return new TestProxy(new TestImpl()).getTest();

}

===================================
数据库连接池使用代理
public class _Connection implements InvocationHandler {
    private final static String CLOSE_METHOD_NAME = "close";
    private Connection conn = null;
    private boolean inUse = false; //数据库的忙状态
    private long lastAccessTime = System.currentTimeMillis();
    _Connection(Connection conn, boolean inUse) {
        this.conn = conn;
        this.inUse = inUse;
    }
    public Connection getConnection() {//返回数据库连接conn的接管类,以便截住close方法       
        return (Connection) Proxy.newProxyInstance(
                    conn.getClass().getClassLoader(),
                    conn.getClass().getInterfaces(),
                    this);
    }
    void close() throws SQLException { //直接关闭连接
        conn.close();
    }
public boolean isInUse() {  return inUse;  }
    public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
        Object obj = null;
        //判断是否调用了close的方法,如果调用close方法则把连接置为无用状态
        if (CLOSE_METHOD_NAME.equals(m.getName()))
            setInUse(false);
        else
            obj = m.invoke(conn, args);
        //设置最后一次访问时间,以便及时清除超时的连接
        lastAccessTime = System.currentTimeMillis();
        return obj;
    }
    public long getLastAccessTime() {     return lastAccessTime;    }
    public void setInUse(boolean inUse) {    this.inUse = inUse;    }
}







分享到:
评论

相关推荐

    AOP在Android中的使用(作为依赖库)

    面向切面编程(Aspect Oriented Programming,简称AOP)是一种编程范式,它将关注点分离,使得系统中的交叉性关注点(如日志、事务管理、...随着对AOP理解的深入,开发者可以创建出更高效、更具弹性的Android应用程序。

    深入理解Android之AOP

    面向切面编程(AOP)是软件开发领域的一项重要技术,它与面向对象编程(OOP)相对应,但关注点不同。在本篇中,我们将深入探讨AOP的基本概念、优势以及在Android开发中的应用,同时与OOP进行比较分析。 首先,面向...

    aopalliance-1.0.jar及aopalliance源码

    例如,在Spring框架中,`MethodInterceptor`被用于实现AOP代理,而`MethodInvocation`则封装了对目标方法的调用。这样,开发者可以选择任何支持AOP Alliance的框架,而不必担心与其它组件的兼容性问题。 **应用场景...

    Spring AOP基础关于AOP是什么的理解

    Spring AOP 基础关于 AOP 是什么的理解 AOP(Aspect Oriented Programming 面向方面的编程)是一种实现横切面的工具,它是 OOP 的补充,而不是 OOP 的竞争对手。AOP 的出现是为了解决 OOP 中的缺陷,即 OOP 中的类...

    Spring AOP 概念理解及@AspectJ支持

    Spring AOP提供了对@AspectJ注解的支持,这是一种声明式的方式来定义切面。@AspectJ是一种类型级别的切面语言,它允许我们使用Java类和方法来表示切面,而不是使用XML配置。使用@AspectJ,我们可以更直观地编写和...

    SpringAop的简单理解.pdf

    SpringAOP通过使用动态代理技术,实现对目标对象方法调用的拦截,并根据切面定义的切点将增强应用到相应的连接点上。开发者只需要编写切面逻辑,无需修改业务代码,可以更清晰地分离关注点,并提高代码的复用性和可...

    spring-boot aop

    5. **理解代理行为**:理解Spring AOP代理的工作方式很重要,因为这可能影响到何时以及如何调用通知。例如,直接通过`@Autowired`注入的bean之间的相互调用不会触发AOP通知,除非显式地通过代理引用进行调用。 6. *...

    aopalliance

    这允许开发者在Spring中使用AspectJ或其他AOP框架的拦截器和通知,无需对代码进行大规模修改。 2. 拓展性:通过AOPAlliance,Spring 2.0可以轻松地添加新的AOP实现,使得框架的扩展性和可维护性大大增强。 3. 跨...

    Android深入理解Aop

    阿拉神农博客《Android深入理解Aop》的PDF版,也可以在https://blog.csdn.net/innost/article/details/49387395 该网站中直接观看,也可以下载下来保存

    aop开发环境jar包

    4. **Spring Boot**:基于Spring框架的快速开发工具,内建对AOP的支持,并且简化了项目配置。 5. **Logback/Log4j**:日志框架,常与AOP结合使用,记录切面的执行信息。 6. **TestNG/JUnit**:测试框架,用于验证...

    IOC和AOP深刻理解基础代码测试

    在Java Web开发中,IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)是两个至关...记住,理论结合实践是学习的关键,动手操作这些示例代码,将会对这两个概念有更深的理解。

    让aop概念更好的理解

    - **切面(Aspect)**: 是对多个类的行为进行封装的操作。 - **连接点(Join Point)**: 在程序执行过程中某个特定的点,比如方法调用或异常抛出。 - **通知(Advice)**: 在切面的某个特定连接点上执行的动作。 - *...

    aopalliance-1.0

    在实际开发中,比如在Spring框架中,我们可以通过实现这些接口来定义自定义的拦截器,然后将其注册到Spring AOP容器中,从而实现对业务逻辑的灵活控制。 总之,AOP Alliance 1.0 为Java开发者提供了一种标准化的...

    简单spring aop 例子

    本示例将简要介绍如何在Spring应用中实现AOP,通过实际的代码示例帮助理解其工作原理。 首先,我们要理解AOP的核心概念。AOP是一种编程范式,它允许开发者定义“切面”(Aspects),这些切面封装了特定的关注点,如...

    Spring使用AOP的三个jar包

    在Java世界中,Spring框架以其强大的功能和灵活性深受开发者喜爱,尤其在面向切面编程(AOP)方面,Spring提供了非常全面的支持。...同时,了解这些基础组件的工作原理,将有助于你更好地理解和优化Spring AOP的应用。

    仿springAOP框架

    在仿Spring AOP框架中,你可以使用动态代理(如JDK Proxy或CGLIB)来创建代理对象,确保对目标对象的所有调用都能触发切面逻辑。 最后,通过实际的**测试案例**,我们可以验证和理解上述概念的运作。在`java5_unit...

    spring-aop-jar

    3. spring-aspects-4.1.6.RELEASE.jar:这个jar文件包含了Spring对AspectJ的集成支持。AspectJ是一个全面的面向切面编程(AOP)框架,它可以编译时或运行时织入切面。Spring Aspects提供了与AspectJ的无缝集成,使得...

    Spring AOP面向方面编程原理:AOP概念

    接下来,我们通过一个简单的Spring AOP示例来加深对上述概念的理解。假设我们需要在调用某个公共方法前记录日志,我们可以定义一个`BeforeAdvice`,并在目标方法上应用此通知。 ```java package com.example.aop; ...

    IOC(DI)与AOP概念的理解

    "IOC(DI)与AOP概念的理解" IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是软件设计中两个重要的概念。控制反转的意思是依赖关系的获取方式被反转了。所谓依赖,从程序的角度看,...

    spring-aop源码

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对现有代码进行功能增强的技术。本文将深入探讨Spring AOP的源码,帮助开发者理解其...

Global site tag (gtag.js) - Google Analytics