`

看透Spring AOP

阅读更多
工作原因需要用到一个代理,首选Spring Aop ,很久没用了,今天翻了下文档看了下源码,发现看文档容易晕,看源码结构清晰明了,Advice,PointCut,Advisor泾渭分明,ProxyFactoryBean总控。
Target:主角,目的就是生成target的代理对象。
Advice:抛弃概念简单理解就是你要插入target的执行代码。
PointCut:就是你要在target文件的哪个方法哪个位置插入,之前还是之后。
Advisor:用来整合Advice与PointCut。
Spring Aop复杂在对于前四者再加上Interceptor的封装,对这四者的装饰封装衍生出了好多类,而实际上就是Proxy.newProxyInstance()罢了(对于非接口当然是耳熟能详的cglib),接下来用JDK动态代理来模拟一下,不想写那么多类了,就Advice植入Target吧,其他硬编码了。
advice接口及两个实现:
package cn.easyweb.aop;

import java.lang.reflect.InvocationHandler;

public interface Advice extends InvocationHandler{
	public Object getTarget();	
}

package cn.easyweb.aop;

import java.lang.reflect.Method;

public class BeforeAdvice implements Advice{
	
	public Object target;
	
	public BeforeAdvice(Object target){
		this.target = target;
	}
	
	
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("before....");
		method.invoke(target, args);
		return null;
	}


	public Object getTarget() {
		return target;
	}

}
package cn.easyweb.aop;

import java.lang.reflect.Method;

public class AfterAdvice implements Advice{
	
	public Object target;
	
	public AfterAdvice(Object target){
		this.target = target;
	}

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		method.invoke(target, args);
		System.out.println("after.....");
		return null;
	}

	public Object getTarget() {
		return target;
	}

}

主控类EasyProxy :
package cn.easyweb.aop;


public class EasyProxy {
	
	public Advice advice;
	
	public Object createProxy(Advice advice){
		this.advice = advice;
		return new AopFactory().getObject(advice.getTarget(), advice);
	}

}

代理工厂:
package cn.easyweb.aop;

import java.lang.reflect.Proxy;

public class AopFactory {
	
	public Object getObject(Object target,Advice advice){
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), advice);
	}

}

需要代理的接口及实现类:
package cn.easyweb.aop;

public interface SourceAssaign {
	
	public void assaign();

}
package cn.easyweb.aop;


public class SimcardAssaign implements SourceAssaign {

	public void assaign() {
		System.out.println("simcard assaign");
	}

}


测试类:
package cn.easyweb.aop;


public class TestAOP {
	
	public static void main(String[] args) {
		EasyProxy proxy = new EasyProxy();
		Object obj =  proxy.createProxy(new BeforeAdvice(new SimcardAssaign()));
		SourceAssaign assaign = (SourceAssaign) proxy.createProxy(new AfterAdvice(obj));
		assaign.assaign();
		
	}
}

Advice为继承InvocationHandler的接口,抽象个接口用来实现代理链,target简单起见聚合进advice。

aop的应用非常广,除了平时经常见到的事物日志啊这些乱七八糟的控制 以外,前两天看连接池时候突然发现c3p0的也用到了动态代理,连接池产生的connection全部用动态代理产生,好处是每次调用connection.close()时,防止被真正关闭,而是让其回归连接池,当然使用spring的人估计是很难发现这点,这也是用惯了封装框架的弊端啊。

另外个人觉得spring aop之所以强大的原因还是有IOC在支持,除去IOC spring aop无非就是对几个代理点封装的好而已,单独用AspectJ都比这强,但是一加入IOC就真正做到了热插拔,侵入性一下子消失了,所以spring的核心个人觉得还应该是IOC,而不是IOC+AOP。

下次再写一篇spring jdbc的,spring jdbc的设计相当完美,用模版和回调解决jdbc的冗余代码,Rod Johnson太有才了。。。。。。
分享到:
评论

相关推荐

    看透spring mvc源代码分析与实践扫描版带目录+源码

    这本书“看透Spring MVC源代码分析与实践”显然是为了帮助开发者深入理解Spring MVC的工作原理,并通过源码分析提升实战技能。在本文中,我们将探讨Spring MVC的关键概念、设计模式以及源码中的重要组成部分。 1. *...

    【面试资料】-(机构内训资料)看透Spring MVC源代码分析与实践.zip

    这份【面试资料】-(机构内训资料)看透Spring MVC源代码分析与实践.zip文件很可能是为了帮助求职者准备相关面试问题而设计的,包含了对Spring MVC工作原理、关键组件和源码解读的详尽解析。 1. **Spring MVC基本...

    看透Spring MVC源代码分析与实践

    《看透Spring MVC源代码分析与实践》这本书深入剖析了Spring MVC这一强大的Web应用程序开发框架。Spring MVC作为Spring框架的一部分,被广泛应用于企业级Java应用中,它为开发者提供了构建可扩展、模块化且易于维护...

    源码: 看透Spring MVC:源代码分析与实践

    《看透Spring MVC:源代码分析与实践》是一本深入探讨Spring MVC框架核心机制的书籍。通过对源代码的解析,读者可以深入了解这个广泛使用的Java Web开发框架的工作原理,从而更好地运用和优化自己的项目。该书提供了...

    看透springMvc源代码分析与实践,韩路彪著

    SpringMVC是Spring框架的一部分,它为开发者提供了构建可扩展、高性能Web应用程序的强大工具。这本书深入浅出地探讨了SpringMVC的工作原理和实现机制,帮助读者从源代码层面理解其内部运作。 SpringMVC的核心概念...

    看透springMvc源代码分析与实践

    除此之外,书中还将涵盖SpringMVC与其它Spring模块的集成,如AOP(面向切面编程)用于实现事务管理、权限控制等,以及SpringMVC与模板引擎(如Thymeleaf、FreeMarker)的配合,创建动态视图。 最后,实战部分会提供...

    看透springMvc源代码分析与实践.pdf

    《看透SpringMVC源代码分析与实践》这本书旨在帮助读者深入理解SpringMVC这一流行的Java Web框架的工作原理,通过源代码分析与实践相结合的方式,提升开发者的技术深度和解决问题的能力。SpringMVC作为Spring框架的...

    SpringMVC学习文档

    此外,SpringMVC与Spring其他模块(如Spring AOP、Spring JDBC等)紧密集成,提供了全面的企业级解决方案。 总的来说,SpringMVC是Java Web开发的重要工具,通过深入学习和实践,开发者能够构建高效、灵活且易于...

    SpringMVC-lean:看透SpringMVC源码分析与实战笔记

    3. AOP切面编程:利用Spring的AOP功能,实现全局异常处理、事务管理等。 4. RESTful设计:遵循RESTful原则设计API,使服务更加清晰、易于理解和维护。 总之,深入理解SpringMVC的源码分析,不仅可以帮助我们解决...

    springMVC源码详解

    AOP用于实现如日志记录、事务管理等功能,而IoC则是Spring框架的核心,通过依赖注入来解耦组件,使得系统更易于测试和维护。 在实践部分,我们需要通过创建实际项目来应用所学知识。例如,构建RESTful API、处理...

Global site tag (gtag.js) - Google Analytics