反射,反射,程序员的快乐。哈哈哈。
最近看了张孝祥关于模拟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...
一定要多比较,多思考,多总结。。。
相关推荐
Spring提供了两种主要的AOP实现方式:基于代理(Proxy-based)和基于注解(Annotation-based)。 - **基于代理的AOP**:Spring使用JDK动态代理或CGLIB动态代理创建目标对象的代理,代理对象在调用目标方法前后执行...
《SpringAOP实战示例——基于Spring in action 2ed chapter4》 Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许我们通过分离关注点来编写更整洁、可维护的代码。在"Spring in action 2nd edition"的...
在本项目"spring-txn-annotation-demo.zip"中,我们主要关注的是如何使用Spring框架的注解来管理事务,这是一个适合初学者学习和研究的示例。该项目基于Spring 5.0.2版本,结合Maven构建工具以及IntelliJ IDEA(一个...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。本教程将介绍两种常见的Spring AOP配置方法,并通过JUnit...
Spring AOP定义AfterThrowing增加处理实例分析 Spring AOP(Aspect-Oriented Programming)是一种面向切面编程思想,主要用于解决横切关注点问题。AfterThrowing是AOP中的一种Advice类型,用于捕获并处理方法执行...
在 Spring 框架中,Aspect-Oriented Programming(面向切面编程)是一种非常重要的编程范式,它能够帮助开发者实现各种横切关注点的模块化。其中,定义切点是 AOP 中最为关键的一步骤,本文将主要介绍 Spring AOP 中...
6. **Spring Test**:这个模块提供了测试Spring应用程序的支持,包括JUnit和TestNG的集成,以及模拟对象框架,使得单元测试和集成测试更加方便。 7. **Spring Boot**:虽然Spring Boot不属于Spring3.2.0的范畴,但...
在Spring框架中,AOP是通过代理机制来实现的,通过定义切面类来截获目标对象的方法调用,然后在这些方法调用前、后或抛出异常时进行相应的操作。 本文主要介绍了Spring AOP的After增强实现方法,通过实例形式分析了...
本文将深入探讨如何模拟Spring实现包扫描器功能,以便在不依赖Spring框架的情况下,扫描指定包下的所有类。 首先,我们需要理解Spring是如何进行包扫描的。在Spring中,这个过程由`org.springframework.context....
Spring中基于xml的AOP的详细步骤 AOP(Aspect-Oriented Programming,即面向切面编程)是一种软件开发技术,它通过预编译方式和运行期动态代理实现程序功能的同一维护。AOP是OOP(Object-Oriented Programming,即...
在Java开发中,Spring框架是广泛使用的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。Spring的注解功能极大地简化了配置,使得开发者可以更专注于业务逻辑。本篇将深入探讨如何自定义注解...
#### 第三课:模拟Spring功能 - **模拟目标**:本节主要是理解Spring框架的核心功能——依赖注入(Dependency Injection, DI),并通过自定义的方式模拟其实现。 - **DI概念**:DI是一种软件设计模式,它提倡将组件...
在Spring 2.5.5中,AOP主要通过基于代理的实现,包括JDK动态代理和CGLIB代理。 在Spring框架中,IoC容器是核心,负责管理对象的生命周期和依赖关系。在Spring 2.5.5中,你可以使用XML配置文件定义bean,也可以使用...
2. **AOP模块**:Spring的AOP支持包括基于代理的AOP(Proxy-based AOP)和基于注解的AOP(Annotation-based AOP)。基于代理的AOP通过动态代理实现切面,而基于注解的AOP则允许开发者直接在方法上使用注解声明切面。...
使用JUnit和Hamcrest,我们可以编写针对Spring Bean、AOP切面、数据访问层(如JDBC、Hibernate或MyBatis)以及服务层的测试。通过模拟(Mocking)和存根(Stubbing)外部依赖,我们可以确保测试的隔离性,只关注被测...
`org.springframework.aop.aspectj.annotation.AspectJAnnotationAdvisor` 类是用于处理基于注解的切面,而 `org.springframework.aop.aspectj.AspectJExpressionPointcut` 负责匹配切点表达式。 三、IoC 容器 ...
8. **Spring Boot**:虽然Spring Boot不在`spring.zip`中,但它是基于Spring框架的快速开发工具,简化了Spring应用的配置和启动过程。Spring Boot的核心在于`org.springframework.boot`包,它提供了自动配置、内嵌...
3. **Mockito与Spring集成**:Spring测试模块可以与Mockito等模拟框架集成,方便进行行为驱动开发(BDD)和单元测试。 4. **SpringJUnit4ClassRunner**与**SpringRunner**:这些测试运行器使得JUnit测试类可以利用...
Spring 测试是指对基于 Spring 框架的应用程序的测试。Spring 提供了一个测试框架,名为 Spring TestContext Framework,该框架提供了一个通用的测试环境,可以用于测试 Spring 应用程序。在 Spring 测试中,我们...