我们都知道spring的配置文件中可以进行声明式事务管理,其基于的原理是spring aop 切片编程,aop是基于动态代理的,动态代理可以从jvm加载类时通过反射对方法进行额外的处理。
1,先定义一个接口,把我们要做的事情写成接口方法
public interface IOstocy{ void sayHello(String name); void sayGoodBye(String name); }
2,我们给与IOstocy一个实现类
public class Ostocy implements IOstocy{ public void sayHello(String name){ System.out.println("hello"+name); } public void sayGoodBye(String name){ System.out.println(name+"goodsBye!"); } }
3,定义一个接口,用来保存你需要对IOstocy逻辑进行额外处理的方法,例如记录sayHello的对象是谁
public interface IOperation{ void start(Method method); void end(Method method); }
定义了一个开始和结束接口方法,接下来需要给一个实现类
4,定义个实现类,去实现IOperation接口
public class LoggerOperation implements IOperation { public void end(Method method) { Logger.logging(Level.DEBUGE, method.getName() + " Method end ."); } public void start(Method method) { Logger.logging(Level.INFO, method.getName() + " Method Start!"); } }
5,要写一个代理类了,这个代理类,会把IOstocy和IOperation分开处理,IOstocy中的方法是很被动的,就呆着那里,等IOperation在他随便哪个位置进来。到底从前还是后进来,就要看你自己怎么处理了,这涉及到@after @before的实现原理了。
public class DynaProxyHello implements InvocationHandler { /** * 操作者 */ private Object proxy; /** * 要处理的对象(也就是我们要在方法的前后加上业务逻辑的对象,如例子中的Hello) */ private Object delegate; /** * 动态生成方法被处理过后的对象 (写法固定) * * @param delegate * @param proxy * @return */ public Object bind(Object delegate,Object proxy) { this.proxy = proxy; this.delegate = delegate; return Proxy.newProxyInstance( this.delegate.getClass().getClassLoader(), this.delegate .getClass().getInterfaces(), this); } /** * 要处理的对象中的每个方法会被此方法送去JVM调用,也就是说,要处理的对象的方法只能通过此方法调用 * 此方法是动态的,不是手动调用的 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; try { //反射得到操作者的实例 Class clazz = this.proxy.getClass(); //反射得到操作者的Start方法 Method start = clazz.getDeclaredMethod("start", new Class[] { Method.class }); //反射执行start方法 start.invoke(this.proxy, new Object[] { method }); //执行要处理对象的原本方法 result = method.invoke(this.delegate, args); // 反射得到操作者的end方法 Method end = clazz.getDeclaredMethod("end", new Class[] { Method.class }); // 反射执行end方法 end.invoke(this.proxy, new Object[] { method }); } catch (Exception e) { e.printStackTrace(); } return result; } }
6,测试下
public class Test { public static void main(String[] args) { IOstocy ostocy= (IOstocy)new DynaProxyHello().bind(new Ostocy(),new LoggerOperation()); ostocy.sayGoogBye("Double J"); ostocy.sayHello("Double J"); } }
我的想法是在代理对象的public Object invoke(Object proxy, Method method, Object[] args)方法里面加上个if(),对传进来的method的名字进行判断,判断的条件存在XML里面.这样我们就可以配置文件时行解藕了.如果有兴趣的朋友可以把操作者,被代理者,都通过配置文件进行配置 ,那么就可以写一个简单的SpringAOP框架了.
谢谢 http://www.blogjava.net/DoubleJ/archive/2008/03/04/183796.html
相关推荐
NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/319927
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
Spring AOP的实现机制中文版,动态代理及原理,自定义类加载器
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、可在现有源码上快速进行功能扩展 4、spring boot,mybatis,druid,spring aop的使用
spring aop jar 包
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
java springAOP实现数据字典
一个基于配置文件的Spring AOP的实现。实现了前置通知,后置通知,以及拦截器的功能,配置中有详细的注释。
博客《理解Spring AOP实现与思想》案例代码,对Java技术感兴趣的朋友可以关注一下我,我在csdn为您准备了很多Java干货。
AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring AOP 代理是什么? 引介(Introduction)是什么? 连接点(Joint Point)和切入点(Point Cut)是什么? 织入(Weaving)是什么?
SpringIOC和AOP实现机制模拟,来自与网络。
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
Spring AOP实现,项目源码,Myeclipse直接导入可用,本人根据教程编写,测试通过。
使用Spring的AOP技术,实现日志记录功能。记录如下信息: 在哪个时间访问了哪个方法,方法传入了哪些参数
spring aop切面拦截指定类和方法实现流程日志跟踪 一般情况下,在不侵入业务代码的情况下,需要做流程日志跟踪是比较合理的 采用springaop切面思想
在Spring1.2或之前的版本中,实现AOP的传统方式就是通过实现Spring的AOP API来定义Advice,并设置代理对象。Spring根据Adivce加入到业务流程的时机的不同,提供了四种不同的Advice:Before Advice、After Advice、...
springboot spring aop 拦截器 注解方式实现脱敏(涉及到:pom.xml -->application.properties --->启动类-->拦截器)
springaop多数据库读写分离
初探spring aop内部实现 、从源代码解读spring之DataSource实现和FactoryBean模式