静态代理
实际逻辑类注入到代理类
生成代理类的对象,然后执行代理类同名的方法, 在这个方法里,代理类可以自己做一些操作.
动态代理
生成一个代理类,然后将实现类注入进来,然后调用注入类的方法时执行业务逻辑.
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; }
}
分享到:
相关推荐
面向切面编程(Aspect Oriented Programming,简称AOP)是一种编程范式,它将关注点分离,使得系统中的交叉性关注点(如日志、事务管理、...随着对AOP理解的深入,开发者可以创建出更高效、更具弹性的Android应用程序。
面向切面编程(AOP)是软件开发领域的一项重要技术,它与面向对象编程(OOP)相对应,但关注点不同。在本篇中,我们将深入探讨AOP的基本概念、优势以及在Android开发中的应用,同时与OOP进行比较分析。 首先,面向...
例如,在Spring框架中,`MethodInterceptor`被用于实现AOP代理,而`MethodInvocation`则封装了对目标方法的调用。这样,开发者可以选择任何支持AOP Alliance的框架,而不必担心与其它组件的兼容性问题。 **应用场景...
Spring AOP 基础关于 AOP 是什么的理解 AOP(Aspect Oriented Programming 面向方面的编程)是一种实现横切面的工具,它是 OOP 的补充,而不是 OOP 的竞争对手。AOP 的出现是为了解决 OOP 中的缺陷,即 OOP 中的类...
Spring AOP提供了对@AspectJ注解的支持,这是一种声明式的方式来定义切面。@AspectJ是一种类型级别的切面语言,它允许我们使用Java类和方法来表示切面,而不是使用XML配置。使用@AspectJ,我们可以更直观地编写和...
SpringAOP通过使用动态代理技术,实现对目标对象方法调用的拦截,并根据切面定义的切点将增强应用到相应的连接点上。开发者只需要编写切面逻辑,无需修改业务代码,可以更清晰地分离关注点,并提高代码的复用性和可...
5. **理解代理行为**:理解Spring AOP代理的工作方式很重要,因为这可能影响到何时以及如何调用通知。例如,直接通过`@Autowired`注入的bean之间的相互调用不会触发AOP通知,除非显式地通过代理引用进行调用。 6. *...
这允许开发者在Spring中使用AspectJ或其他AOP框架的拦截器和通知,无需对代码进行大规模修改。 2. 拓展性:通过AOPAlliance,Spring 2.0可以轻松地添加新的AOP实现,使得框架的扩展性和可维护性大大增强。 3. 跨...
阿拉神农博客《Android深入理解Aop》的PDF版,也可以在https://blog.csdn.net/innost/article/details/49387395 该网站中直接观看,也可以下载下来保存
4. **Spring Boot**:基于Spring框架的快速开发工具,内建对AOP的支持,并且简化了项目配置。 5. **Logback/Log4j**:日志框架,常与AOP结合使用,记录切面的执行信息。 6. **TestNG/JUnit**:测试框架,用于验证...
在Java Web开发中,IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)是两个至关...记住,理论结合实践是学习的关键,动手操作这些示例代码,将会对这两个概念有更深的理解。
- **切面(Aspect)**: 是对多个类的行为进行封装的操作。 - **连接点(Join Point)**: 在程序执行过程中某个特定的点,比如方法调用或异常抛出。 - **通知(Advice)**: 在切面的某个特定连接点上执行的动作。 - *...
在实际开发中,比如在Spring框架中,我们可以通过实现这些接口来定义自定义的拦截器,然后将其注册到Spring AOP容器中,从而实现对业务逻辑的灵活控制。 总之,AOP Alliance 1.0 为Java开发者提供了一种标准化的...
本示例将简要介绍如何在Spring应用中实现AOP,通过实际的代码示例帮助理解其工作原理。 首先,我们要理解AOP的核心概念。AOP是一种编程范式,它允许开发者定义“切面”(Aspects),这些切面封装了特定的关注点,如...
在Java世界中,Spring框架以其强大的功能和灵活性深受开发者喜爱,尤其在面向切面编程(AOP)方面,Spring提供了非常全面的支持。...同时,了解这些基础组件的工作原理,将有助于你更好地理解和优化Spring AOP的应用。
在仿Spring AOP框架中,你可以使用动态代理(如JDK Proxy或CGLIB)来创建代理对象,确保对目标对象的所有调用都能触发切面逻辑。 最后,通过实际的**测试案例**,我们可以验证和理解上述概念的运作。在`java5_unit...
3. spring-aspects-4.1.6.RELEASE.jar:这个jar文件包含了Spring对AspectJ的集成支持。AspectJ是一个全面的面向切面编程(AOP)框架,它可以编译时或运行时织入切面。Spring Aspects提供了与AspectJ的无缝集成,使得...
接下来,我们通过一个简单的Spring AOP示例来加深对上述概念的理解。假设我们需要在调用某个公共方法前记录日志,我们可以定义一个`BeforeAdvice`,并在目标方法上应用此通知。 ```java package com.example.aop; ...
"IOC(DI)与AOP概念的理解" IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是软件设计中两个重要的概念。控制反转的意思是依赖关系的获取方式被反转了。所谓依赖,从程序的角度看,...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对现有代码进行功能增强的技术。本文将深入探讨Spring AOP的源码,帮助开发者理解其...