- 浏览: 101500 次
- 性别:
- 来自: 武汉
-
最新评论
-
zljerityzljerity:
<#assign ipage=page?number&g ...
freeMark全解 -
qiankai86:
...
freeMark全解
AOP功能强大,但是spring是如何来实现AOP技术的呢?
SPRING是通过动态代理来实现AOP的,SPRING内部提供了2种实现机制
1.如果是有接口声明的类进行AOP,spring调用的是java.lang.reflection.Proxy类来做处理
- org.springframework.aop.framework.JdkDynamicAopProxy
- public Object getProxy(ClassLoader classLoader) {
- if (logger.isDebugEnabled()) {
- Class targetClass = this.advised.getTargetSource().getTargetClass();
- logger.debug("Creating JDK dynamic proxy" +
- (targetClass != null ? " for [" + targetClass.getName() + "]" : ""));
- }
- Class[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised);
- return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
- }
- org.springframework.aop.framework.ReflectiveMethodInvocation
- public Object proceed() throws Throwable {
- // We start with an index of -1 and increment early.
- if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {
- return invokeJoinpoint();
- }
- Object interceptorOrInterceptionAdvice =
- this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);
- if (interceptorOrInterceptionAdvice instanceof InterceptorAndDynamicMethodMatcher) {
- // Evaluate dynamic method matcher here: static part will already have
- // been evaluated and found to match.
- InterceptorAndDynamicMethodMatcher dm =
- (InterceptorAndDynamicMethodMatcher) interceptorOrInterceptionAdvice;
- if (dm.methodMatcher.matches(this.method, this.targetClass, this.arguments)) {
- return dm.interceptor.invoke(this);
- }
- else {
- // Dynamic matching failed.
- // Skip this interceptor and invoke the next in the chain.
- return proceed();
- }
- }
- else {
- // It's an interceptor, so we just invoke it: The pointcut will have
- // been evaluated statically before this object was constructed.
- return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);
- }
- }
org.springframework.aop.framework.JdkDynamicAopProxy public Object getProxy(ClassLoader classLoader) { if (logger.isDebugEnabled()) { Class targetClass = this.advised.getTargetSource().getTargetClass(); logger.debug("Creating JDK dynamic proxy" + (targetClass != null ? " for [" + targetClass.getName() + "]" : "")); } Class[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised); return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this); } org.springframework.aop.framework.ReflectiveMethodInvocation public Object proceed() throws Throwable { // We start with an index of -1 and increment early. if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) { return invokeJoinpoint(); } Object interceptorOrInterceptionAdvice = this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex); if (interceptorOrInterceptionAdvice instanceof InterceptorAndDynamicMethodMatcher) { // Evaluate dynamic method matcher here: static part will already have // been evaluated and found to match. InterceptorAndDynamicMethodMatcher dm = (InterceptorAndDynamicMethodMatcher) interceptorOrInterceptionAdvice; if (dm.methodMatcher.matches(this.method, this.targetClass, this.arguments)) { return dm.interceptor.invoke(this); } else { // Dynamic matching failed. // Skip this interceptor and invoke the next in the chain. return proceed(); } } else { // It's an interceptor, so we just invoke it: The pointcut will have // been evaluated statically before this object was constructed. return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this); } }
2.如果是没有接口声明的类呢?SPRING通过CGLIB包和内部类来实现
- private static class StaticUnadvisedInterceptor implements MethodInterceptor, Serializable {
- private final Object target;
- public StaticUnadvisedInterceptor(Object target) {
- this.target = target;
- }
- public Object intercept(Object proxy, Method method, Object[] args,
- MethodProxy methodProxy) throws Throwable {
- Object retVal = methodProxy.invoke(target, args);
- return massageReturnTypeIfNecessary(proxy, target, retVal);
- }
- }
- /**
- * Method interceptor used for static targets with no advice chain, when the
- * proxy is to be exposed.
- */
- private static class StaticUnadvisedExposedInterceptor implements MethodInterceptor, Serializable {
- private final Object target;
- public StaticUnadvisedExposedInterceptor(Object target) {
- this.target = target;
- }
- public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
- Object oldProxy = null;
- try {
- oldProxy = AopContext.setCurrentProxy(proxy);
- Object retVal = methodProxy.invoke(target, args);
- return massageReturnTypeIfNecessary(proxy, target, retVal);
- }
- finally {
- AopContext.setCurrentProxy(oldProxy);
- }
- }
- }
- /**
- * Interceptor used to invoke a dynamic target without creating a method
- * invocation or evaluating an advice chain. (We know there was no advice
- * for this method.)
- */
- private class DynamicUnadvisedInterceptor implements MethodInterceptor, Serializable {
- public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
- Object target = advised.getTargetSource().getTarget();
- try {
- Object retVal = methodProxy.invoke(target, args);
- return massageReturnTypeIfNecessary(proxy, target, retVal);
- }
- finally {
- advised.getTargetSource().releaseTarget(target);
- }
- }
- }
- /**
- * Interceptor for unadvised dynamic targets when the proxy needs exposing.
- */
- private class DynamicUnadvisedExposedInterceptor implements MethodInterceptor, Serializable {
- public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
- Object oldProxy = null;
- Object target = advised.getTargetSource().getTarget();
- try {
- oldProxy = AopContext.setCurrentProxy(proxy);
- Object retVal = methodProxy.invoke(target, args);
- return massageReturnTypeIfNecessary(proxy, target, retVal);
- }
- finally {
- AopContext.setCurrentProxy(oldProxy);
- advised.getTargetSource().releaseTarget(target);
- }
- }
- }
private static class StaticUnadvisedInterceptor implements MethodInterceptor, Serializable { private final Object target; public StaticUnadvisedInterceptor(Object target) { this.target = target; } public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object retVal = methodProxy.invoke(target, args); return massageReturnTypeIfNecessary(proxy, target, retVal); } } /** * Method interceptor used for static targets with no advice chain, when the * proxy is to be exposed. */ private static class StaticUnadvisedExposedInterceptor implements MethodInterceptor, Serializable { private final Object target; public StaticUnadvisedExposedInterceptor(Object target) { this.target = target; } public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object oldProxy = null; try { oldProxy = AopContext.setCurrentProxy(proxy); Object retVal = methodProxy.invoke(target, args); return massageReturnTypeIfNecessary(proxy, target, retVal); } finally { AopContext.setCurrentProxy(oldProxy); } } } /** * Interceptor used to invoke a dynamic target without creating a method * invocation or evaluating an advice chain. (We know there was no advice * for this method.) */ private class DynamicUnadvisedInterceptor implements MethodInterceptor, Serializable { public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object target = advised.getTargetSource().getTarget(); try { Object retVal = methodProxy.invoke(target, args); return massageReturnTypeIfNecessary(proxy, target, retVal); } finally { advised.getTargetSource().releaseTarget(target); } } } /** * Interceptor for unadvised dynamic targets when the proxy needs exposing. */ private class DynamicUnadvisedExposedInterceptor implements MethodInterceptor, Serializable { public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object oldProxy = null; Object target = advised.getTargetSource().getTarget(); try { oldProxy = AopContext.setCurrentProxy(proxy); Object retVal = methodProxy.invoke(target, args); return massageReturnTypeIfNecessary(proxy, target, retVal); } finally { AopContext.setCurrentProxy(oldProxy); advised.getTargetSource().releaseTarget(target); } } }
我们自己也可以来试试
1.jdk proxy方式
先来一个接口
IHelloWorld.java
- package kris.aop.test;
- public interface IHelloWorld {
- public void print(String name);
- public void write(String sth);
- }
package kris.aop.test; public interface IHelloWorld { public void print(String name); public void write(String sth); }
再来一个实现
HelloWorld.java
- package kris.aop.test;
- public class HelloWorld implements IHelloWorld {
- public void print(String name){
- System.out.println("HelloWorld "+name);
- }
- public void write(String sth) {
- System.out.println("write "+sth);
- }
- }
package kris.aop.test; public class HelloWorld implements IHelloWorld { public void print(String name){ System.out.println("HelloWorld "+name); } public void write(String sth) { System.out.println("write "+sth); } }
代理类
DefaultInvocationHandler.java
- package kris.aop.test;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- public class DefaultInvocationHandler implements InvocationHandler {
- /**
- * 替换外部class调用的方法
- * obj 外部已经已经包装好InvocationHandler的实例
- * method 外部方法
- * args 方法参数
- */
- public Object invoke(Object obj, Method method, Object[] args)
- throws Throwable {
- String s1 []={"kris"};
- String s2 []={"anyone"};
- IHelloWorld ihw=new HelloWorld();
- System.out.println("start!");
- method.invoke(ihw,args);
- method.invoke(ihw,s1);
- Object o=method.invoke(ihw,s2);
- System.out.println("stop!");
- return o;
- }
- }
package kris.aop.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DefaultInvocationHandler implements InvocationHandler { /** * 替换外部class调用的方法 * obj 外部已经已经包装好InvocationHandler的实例 * method 外部方法 * args 方法参数 */ public Object invoke(Object obj, Method method, Object[] args) throws Throwable { String s1 []={"kris"}; String s2 []={"anyone"}; IHelloWorld ihw=new HelloWorld(); System.out.println("start!"); method.invoke(ihw,args); method.invoke(ihw,s1); Object o=method.invoke(ihw,s2); System.out.println("stop!"); return o; } }
测试类
Test.java
- package kris.aop.test;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Proxy;
- public class Test {
- public static void main(String args []){
- Class clazz = new HelloWorld().getClass();
- ClassLoader cl = clazz.getClassLoader();
- Class classes [] = clazz.getInterfaces();
- InvocationHandler ih=new DefaultInvocationHandler();
- //用InvocationHandler给HelloWorld进行AOP包装
- IHelloWorld ihw=(IHelloWorld) Proxy.newProxyInstance(cl,classes,ih);
- ihw.print("test");
- ihw.write("test");
- }
- }
package kris.aop.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Test { public static void main(String args []){ Class clazz = new HelloWorld().getClass(); ClassLoader cl = clazz.getClassLoader(); Class classes [] = clazz.getInterfaces(); InvocationHandler ih=new DefaultInvocationHandler(); //用InvocationHandler给HelloWorld进行AOP包装 IHelloWorld ihw=(IHelloWorld) Proxy.newProxyInstance(cl,classes,ih); ihw.print("test"); ihw.write("test"); } }
2.用CGLIB包实现,首先不要忘了引入那个包
- package kris.aop.cglib.test;
- public class HelloWorld {
- public void print(String name){
- System.out.println("HelloWorld "+name);
- }
- public void write(String sth) {
- System.out.println("write "+sth);
- }
- public void print(){
- System.out.println("HelloWorld");
- }
- }
package kris.aop.cglib.test; public class HelloWorld { public void print(String name){ System.out.println("HelloWorld "+name); } public void write(String sth) { System.out.println("write "+sth); } public void print(){ System.out.println("HelloWorld"); } }
代理类(没用内部类,看起来清楚点)
- package kris.aop.cglib.test;
- import java.lang.reflect.Method;
- import net.sf.cglib.proxy.MethodInterceptor;
- import net.sf.cglib.proxy.MethodProxy;
- public class MethodInterceptorImpl implements MethodInterceptor {
- public Object intercept(Object obj, Method method, Object[] args,
- MethodProxy proxy) throws Throwable {
- System.out.println(method);
- proxy.invokeSuper(obj, args);
- return null;
- }
- }
package kris.aop.cglib.test; import java.lang.reflect.Method; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class MethodInterceptorImpl implements MethodInterceptor { public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println(method); proxy.invokeSuper(obj, args); return null; } }
测试类
- package kris.aop.cglib.test;
- import net.sf.cglib.proxy.Enhancer;
- public class Test {
- public static void main(String[] args) {
- Enhancer enhancer = new Enhancer();
- enhancer.setSuperclass(HelloWorld.class);
- //设置回调方法实现类
- enhancer.setCallback(new MethodInterceptorImpl());
- //实例化已经添加回调实现的HELLOWORLD实例
- HelloWorld my = (HelloWorld) enhancer.create();
- my.print();
- }
- }
发表评论
-
ofbiz 之entity实体
2014-03-25 18:16 955ofbiz 之entity实体 1. 实体定义文件 实体定 ... -
ofbiz迷你语言
2012-08-08 17:13 2310simple-map-processor 和 sim ... -
ofbiz之entity 实体解析
2012-08-08 17:12 1525ofbiz 之entity实体 1. 实体定义文件 实体定 ... -
ofbiz之旅-实体简介(中英译)
2012-08-09 09:34 1183OFBIZ ENTITY ENGINE COOKBOOK = ... -
OFBIz之旅[结构]
2012-08-08 17:03 1505OFBIz之旅[结构] 注意: 1,持久层,在OFBI ... -
java concurrent 探秘(2)
2011-08-08 14:21 927java concurrent 探秘(2) Blo ... -
java concurrent 探秘
2011-08-08 11:02 828java concurrent 探秘 我们都知道,在JD ... -
one-to-one 一对一主键关联映射_单向
2011-08-03 17:22 1337one-to-one 一对一主键关联映射_单向 一对一主键关 ... -
JavaScript验证正则表达式大全
2011-07-27 17:18 934上篇文章《JavaScript验证正则表达式大全》说的是jav ... -
JavaScript验证正则表达式大全
2011-07-27 17:17 842JavaScript验证正则表达式大全 JavaScript验 ... -
js 收集1
2011-01-14 09:49 10741.javascript的数组API Js代码 ... -
struts 核心解析
2010-12-03 14:25 2467一、概述 Struts2的核心是一个Fil ... -
Java类库中的集合类解析
2010-11-29 16:05 1098这篇我准备从源码的高度来看看集合中各个实现类的是如何组织我们存 ... -
jboss classloader机制以及scope配置
2010-11-29 15:06 17261. 概念介绍 UCL : org.jboss.mx. ... -
总结和对比一下(jboss,tomcat,jetty)容器的classloader机制
2010-11-29 14:58 1999总结和对比一下(jboss,tomcat,je ... -
jboss,tomcat,jetty 容器的classloader机制
2010-11-29 14:53 4602背景 前段时间一直在做应用容器的迁移,将公司的应用 ... -
Session,Cookie,jsessionid和Url重写
2010-11-29 12:55 1940Session,Cookie,jsessionid ... -
DWR work
2010-11-25 18:14 902这段时间较闲,研究了一 ... -
CXF jaxws spring configuration
2010-11-19 16:27 1608最近在cxf-zh中有人问及了有关Spring配置CXF Cl ... -
线程安全总结2
2010-11-17 16:48 830站内很多人都问我,所谓线程的“工作内存”到底是个什么东西? ...
相关推荐
本篇文章将深入探讨Spring AOP的内部实现,以及如何通过源代码理解其DataSource实现和FactoryBean模式。 首先,让我们了解AOP的基本概念。AOP的核心思想是“切面”,它封装了特定的关注点,如日志记录、事务管理、...
最后,本文的目标是从实现的角度来认识 SpringAOP 框架,观察的角度是从外部接口、内部实现、组成部分、执行过程四个方面来认识 SpringAOP 框架。本文的风格是首先列出 AOP 的基本概念,然后介绍框架所涉及到的核心...
Spring AOP在内部也是基于类似的方式工作,但它的实现更为复杂和高效。它不仅可以处理接口代理,还可以处理基于类的代理,支持CGLIB库生成字节码实现。此外,Spring AOP还提供了一套强大的切点表达式和注解,使得...
本示例提供了一种通过注解和配置文件两种方式实现Spring AOP的方法。 首先,我们来详细讲解通过注解实现Spring AOP。在Spring中,我们可以使用`@Aspect`注解来定义一个切面,这个切面包含了多个通知(advice),即...
【Spring AOP实现方法大全】 在Spring框架中,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们在不修改业务代码的情况下,插入额外的功能,比如日志记录、事务管理等。在...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,用于实现横切关注点的模块化。它允许开发者定义“切面”,将那些与业务逻辑无关,却为多个对象共有的行为(如日志、...
使用Spring AOP,可以在方法执行前后自动记录日志,无需在每个方法内部添加日志代码。 3.2 事务管理 Spring AOP提供声明式事务管理,可以在切点上定义事务边界,使得事务处理代码不再侵入业务逻辑。 3.3 安全控制...
在Spring的XML配置文件中,我们可以创建一个`<aop:config>`元素,并在其内部定义`<aop:advisor>`来创建Advisor。Advisor的`advice-ref`属性用于指定通知bean的ID,`pointcut-ref`属性用于指定切点bean的ID。 2. ...
9. **享元模式(Flyweight)**:享元模式在Spring AOP中不太直接体现,但在Spring框架的其他部分,如缓存管理,可能会用到此模式来减少内存消耗,通过共享大量细粒度对象的内部状态来降低内存占用。 10. **代理模式...
Spring AOP通过动态代理实现,有两种代理方式:JDK动态代理和CGLIB代理。JDK代理用于接口实现类,而CGLIB代理用于无接口或非代理类。 EL是JavaServer Faces (JSF) 和其他Java技术中用于在视图层解析表达式并获取...
AspectJ是一种更全面的AOP解决方案,它通过编译器织入和类装载期织入来处理AOP,而SpringAOP则是通过动态代理技术来实现AOP。 要让Spring项目支持AOP,需要通过特定的配置来开启aspectj代理的支持。有基于XML的配置...
本章主要探讨了Spring AOP在Spring框架内部的多种应用,包括事件处理、事务管理和缓存等关键功能。 首先,我们来看Spring AOP在Spring事件(Events)中的应用。Spring事件模型允许应用程序组件之间进行异步通信。当...
标题 "springaop" 暗示我们关注的是Spring框架中的AOP(面向切面编程)模块。在Spring框架中,AOP是一种强大的工具,它允许程序员定义“切面”,这些切面可以封装横切关注点,如日志、事务管理、性能监控等,将它们...
标签“源码”意味着这篇博客可能深入解析了Spring AOP的内部工作机制,包括如何通过代理机制实现切面的织入,以及Spring AOP的相关核心类如`Advised`、`ProxyFactoryBean`、`DefaultAdvisorAdapterRegistry`等。...
Spring框架提供了一种强大的AOP实现方式,支持声明式的AOP,并且与Spring容器紧密结合。 #### 关键知识点解析 **1. **Spring AOP对于最外层函数的拦截范围** Spring AOP对于最外层的函数只拦截`public`方法,不...
了解并熟练掌握Spring AOP的XML配置,能够帮助我们更好地实现代码的解耦,提高代码的可维护性和可复用性。通过合理的AOP设计,可以将关注点分离,使我们的业务逻辑更加清晰,同时减少重复代码,提升开发效率。
在这个名为"springAOP-dome"的实例中,我们将探讨如何利用Spring AOP实现一个简单的日志记录功能,以作为入门学习。 首先,了解AOP的基本概念是必要的。面向切面编程是一种编程范式,旨在解决程序中的横切关注点,...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了在Java应用中实现切面编程的能力。在传统的面向对象编程中,关注点分离(例如日志、事务管理)往往与业务逻辑...
在本文中,我们将深入探讨Spring AOP的源码,理解其内部机制和工作原理。 首先,我们需要知道Spring AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和代理(Proxy)...
### Spring框架+SpringAOP动态代理 #### 一、Spring AOP 动态代理概述 在探讨Spring AOP(Aspect-Oriented Programming,面向切面编程)中的动态代理之前,我们首先简要回顾一下AOP的基本概念。面向切面编程是一种...