反射,反射,程序员的快乐。哈哈哈。
最近看了张孝祥关于模拟AOP的视频,自己动手做了修改,也吸取了一些网络上关于模拟spring aop的一些思想,做了一些整理。下面把代码分享给有需要的朋友。
bean工厂:
public class ProxyFactory { public static <T> T getBean(Class<T> clz) throws Exception{ T t = clz.newInstance(); Method[] methods = clz.getMethods(); for(Method method:methods) { ProxyTag pt = method.getAnnotation(ProxyTag.class); if(pt != null) { ProxyBean pb =(ProxyBean)pt.proxyClass().newInstance(); pb.setTarget(t); pb.setMethodName(method.getName()); // pb.setAdvisor(new CustomAdvisor()); t = (T)pb.getProxy(); } } return t; } }
代理bean(抽象类):
abstract class ProxyBean { private Object target; private String methodName; //private Advisor advisor; public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } /*public Advisor getAdvisor() { return advisor; } public void setAdvisor(Advisor advisor) { this.advisor = advisor; }*/ public Object getProxy() { Object proxy = Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().equals(methodName)) { before(method); } Object retVal = method.invoke(target, args); if(method.getName().equals(methodName)) { after(method); } return retVal; } } ); return proxy; } public abstract void before(Method method); public abstract void after(Method method); }
代理bean实现类,主要用于实现接口方法,将父类的实现延迟到子类(有关设计模式的东西,有点模糊,是不是应该这样写?)
public class ProxyBean1 extends ProxyBean{ @Override public void before(Method method) { System.out.println("before the "+method.getName()); } @Override public void after(Method method) { System.out.println("after the "+method.getName()); } }
target(接口-jdk代理):
public interface Target { void reflect(); void reflect2(); void reflect3(); }
target实现类:
public class TargetDerive implements Target{ @ProxyTag(proxyClass=ProxyBean1.class) public void reflect() { System.out.println("enjoy the fun of reflect..."); } @ProxyTag(proxyClass=ProxyBean1.class) public void reflect2() { System.out.println("enjoy the fun of reflect..."); } public void reflect3() { System.out.println("enjoy the fun of reflect..."); } }
注解类:
@Retention(RetentionPolicy.RUNTIME) //保留到运行时,可通过反射获取 @Target(ElementType.METHOD) //目标于方法上 public @interface ProxyTag { public Class proxyClass(); }
测试:
public class AopTest { public static void main(String[] args) throws Exception { Target target = ProxyFactory.getBean(TargetDerive.class); target.reflect(); target.reflect2(); target.reflect3(); } }
输出:
before the reflect enjoy the fun of reflect... after the reflect before the reflect2 enjoy the fun of reflect... after the reflect2 enjoy the fun of reflect...
一定要多比较,多思考,多总结。。。
相关推荐
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.
spring aop框架源码级分析 结构图
通过动态代理模拟Spring AOP,通过动态代理模拟Spring AOP
模拟spring aop技术,一个小demo,希望对您理解aop有所帮助.
NULL 博文链接:https://bijian1013.iteye.com/blog/2142528
仿springAOP框架。里面有测试案例。 涵盖自定义注解,切面,通知等内容。是学习AOP的学员难得的参考资料。
spring aop jar 包
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
基于注解配置和使用spring AOP(spring mvc框架)
NULL 博文链接:https://tuoxinquyu.iteye.com/blog/1465187
描述一下Spring AOP? 在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring 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_Annotation_AOP
手写springAop框架3.zip
Spring AOP之基于AspectJ注解总结与案例 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45394409
Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。
一、适合人群 1、具备一定Java编程基础,初级开发者 2、对springboot,mybatis,mysql有基本认识 3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 ...4、spring boot,mybatis,druid,spring aop的使用
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器...Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中
springaop依赖的jar包,spring版本2.5.6,如果需要,可以下载使用,欢迎各位评论指出不足