静态代理
实际逻辑类注入到代理类
生成代理类的对象,然后执行代理类同名的方法, 在这个方法里,代理类可以自己做一些操作.
动态代理
生成一个代理类,然后将实现类注入进来,然后调用注入类的方法时执行业务逻辑.
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; }
}
分享到:
相关推荐
深入理解Android之AOP;深入理解Android之AOP;深入理解Android之AOP
SpringAop的简单理解.pdf
阿拉神农博客《Android深入理解Aop》的PDF版,也可以在https://blog.csdn.net/innost/article/details/49387395 该网站中直接观看,也可以下载下来保存
IOC(DI)与AOP概念的理解
Java web 开发中的必备神器。IOC和AOP深刻理解其原理,基础代码测试。完整的基础测试项目打包。妈妈再也不用担心我不懂切面编程和控制反转了。干货。仅供初学者使用。
可以让你更好的理解spring下AOP的概念,分布式概念以及应用
详细的介绍了AOP的各种实现,对深入理解AOP有很大的帮助
模拟spring aop技术,一个小demo,希望对您理解aop有所帮助.
主要介绍了深入理解Spring AOP,详细的介绍了spring aop的具体实现与理论
关于AOP是什么的理解,对有java编程基础的初学者者来说绝对有用
博客《理解Spring AOP实现与思想》案例代码,对Java技术感兴趣的朋友可以关注一下我,我在csdn为您准备了很多Java干货。
Spring AOP面向方面编程原理:AOP概念,主要介绍面向对象的概念及原理,及作者的一些理解。
了解SpringAOP相关概念,了解AOP在程序中的优势,Spring 框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对 象的代理对象,根据通知类别,在代理对象的对应位置,将通知对应的...
AOP的概念也很好理解,跟中间件差不多,说白了,就是我可以任意地在方法的前面或后面添加代码,这很适合用于缓存、日志等处理。 在net core2.2时,我当时就尝试过用autofac实现aop,但这次我不想用autofac,我用了一...
NULL 博文链接:https://quicker.iteye.com/blog/670885
Spring 框架中对面向切面编程aop的理解,java中对于spring的理解是有助于java的学习
一直对AOP面向切面编程的理解很模糊的同学可以看看。
Spring的Aop和Ioc示例代码,代码通过了调试的,没得问题.对于初学者理解和使用Spring的Aop和Ioc是够了.
最简单的SpringAOP入门案例,对于配置文件有详细的解释,适合初学者去理解AOP编程
AOP(面向切面)是一种编程范式,提供从另一个角度来考虑程序结构以完善面向对象编程 (OOP)。 AOP为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织入到面向对象 的软件系统中,从而实现了横切...