`
elite20130514
  • 浏览: 48199 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

模拟spring AOP框架(基于annotation)

阅读更多

反射,反射,程序员的快乐。哈哈哈。

最近看了张孝祥关于模拟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 IoC AOP

    Spring提供了两种主要的AOP实现方式:基于代理(Proxy-based)和基于注解(Annotation-based)。 - **基于代理的AOP**:Spring使用JDK动态代理或CGLIB动态代理创建目标对象的代理,代理对象在调用目标方法前后执行...

    SpringAOP例子

    《SpringAOP实战示例——基于Spring in action 2ed chapter4》 Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许我们通过分离关注点来编写更整洁、可维护的代码。在"Spring in action 2nd edition"的...

    spring-txn-annotation-demo.zip

    在本项目"spring-txn-annotation-demo.zip"中,我们主要关注的是如何使用Spring框架的注解来管理事务,这是一个适合初学者学习和研究的示例。该项目基于Spring 5.0.2版本,结合Maven构建工具以及IntelliJ IDEA(一个...

    spring-aop demo及junit测试

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。本教程将介绍两种常见的Spring AOP配置方法,并通过JUnit...

    spring AOP定义AfterThrowing增加处理实例分析

    Spring AOP定义AfterThrowing增加处理实例分析 Spring AOP(Aspect-Oriented Programming)是一种面向切面编程思想,主要用于解决横切关注点问题。AfterThrowing是AOP中的一种Advice类型,用于捕获并处理方法执行...

    Spring AOP中定义切点的实现方法示例

    在 Spring 框架中,Aspect-Oriented Programming(面向切面编程)是一种非常重要的编程范式,它能够帮助开发者实现各种横切关注点的模块化。其中,定义切点是 AOP 中最为关键的一步骤,本文将主要介绍 Spring AOP 中...

    Spring3.2.0 框架jar包及Spring依赖jar包

    6. **Spring Test**:这个模块提供了测试Spring应用程序的支持,包括JUnit和TestNG的集成,以及模拟对象框架,使得单元测试和集成测试更加方便。 7. **Spring Boot**:虽然Spring Boot不属于Spring3.2.0的范畴,但...

    spring AOP的After增强实现方法实例分析

    在Spring框架中,AOP是通过代理机制来实现的,通过定义切面类来截获目标对象的方法调用,然后在这些方法调用前、后或抛出异常时进行相应的操作。 本文主要介绍了Spring AOP的After增强实现方法,通过实例形式分析了...

    模拟spring实现包扫描器功能

    本文将深入探讨如何模拟Spring实现包扫描器功能,以便在不依赖Spring框架的情况下,扫描指定包下的所有类。 首先,我们需要理解Spring是如何进行包扫描的。在Spring中,这个过程由`org.springframework.context....

    Spring中基于xml的AOP的详细步骤

    Spring中基于xml的AOP的详细步骤 AOP(Aspect-Oriented Programming,即面向切面编程)是一种软件开发技术,它通过预编译方式和运行期动态代理实现程序功能的同一维护。AOP是OOP(Object-Oriented Programming,即...

    自定义注解得使用,模拟spring通过注解方式创建bean实例

    在Java开发中,Spring框架是广泛使用的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。Spring的注解功能极大地简化了配置,使得开发者可以更专注于业务逻辑。本篇将深入探讨如何自定义注解...

    spring框架案例学习文档笔记

    #### 第三课:模拟Spring功能 - **模拟目标**:本节主要是理解Spring框架的核心功能——依赖注入(Dependency Injection, DI),并通过自定义的方式模拟其实现。 - **DI概念**:DI是一种软件设计模式,它提倡将组件...

    spring-framework-2.5.5

    在Spring 2.5.5中,AOP主要通过基于代理的实现,包括JDK动态代理和CGLIB代理。 在Spring框架中,IoC容器是核心,负责管理对象的生命周期和依赖关系。在Spring 2.5.5中,你可以使用XML配置文件定义bean,也可以使用...

    spring3.0 api chm doc 离线帮助文档

    2. **AOP模块**:Spring的AOP支持包括基于代理的AOP(Proxy-based AOP)和基于注解的AOP(Annotation-based AOP)。基于代理的AOP通过动态代理实现切面,而基于注解的AOP则允许开发者直接在方法上使用注解声明切面。...

    Spring框架测试.zip

    使用JUnit和Hamcrest,我们可以编写针对Spring Bean、AOP切面、数据访问层(如JDBC、Hibernate或MyBatis)以及服务层的测试。通过模拟(Mocking)和存根(Stubbing)外部依赖,我们可以确保测试的隔离性,只关注被测...

    spring3.07

    `org.springframework.aop.aspectj.annotation.AspectJAnnotationAdvisor` 类是用于处理基于注解的切面,而 `org.springframework.aop.aspectj.AspectJExpressionPointcut` 负责匹配切点表达式。 三、IoC 容器 ...

    Spring源代码(spring.zip)

    8. **Spring Boot**:虽然Spring Boot不在`spring.zip`中,但它是基于Spring框架的快速开发工具,简化了Spring应用的配置和启动过程。Spring Boot的核心在于`org.springframework.boot`包,它提供了自动配置、内嵌...

    org.springframework.test-3.0.2.RELEASE.jar

    3. **Mockito与Spring集成**:Spring测试模块可以与Mockito等模拟框架集成,方便进行行为驱动开发(BDD)和单元测试。 4. **SpringJUnit4ClassRunner**与**SpringRunner**:这些测试运行器使得JUnit测试类可以利用...

    [课堂课件讲解]Java微服务实践-Spring Boot 测试.pptx

    Spring 测试是指对基于 Spring 框架的应用程序的测试。Spring 提供了一个测试框架,名为 Spring TestContext Framework,该框架提供了一个通用的测试环境,可以用于测试 Spring 应用程序。在 Spring 测试中,我们...

Global site tag (gtag.js) - Google Analytics