- 浏览: 224516 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
kandari:
很全,收藏
oracle相关知识 -
若见三生石:
,辛苦楼主!感谢为大伙敏捷开发做出贡献!
Oracle中的二进制、八进制、十进制、十六进制相互转换函数 -
若见三生石:
你好,要定义的类和类型怎么写呢?
Oracle中的二进制、八进制、十进制、十六进制相互转换函数 -
greatwqs:
...
PLSQL操作文件 -
sun17921:
var areaCode ={11:"北京" ...
身份证验证JS
实现AOP流程:
Service s = new ServiceImpl(); //创建切入点 Pointcut pc = new JdkRegexpMethodPointcut();//JdkRegexpMethodPointcut是切入点实现类。spring提供7个切入点实现类@1 //创建通知 Advice advice = new SimpleAdvice();//SimpleAdvice实现了通知接口。srping提供5种通知接口@2 //创建通知者 Advisor advisor = new DefaultPointcutAdvisor(pc,advice);//DefaultPointcutAdvisor是通知者实现类。spring提供3个通知者实现类@3 //创建代理 ProxyFactory pf = new ProxyFactory();//spring支持两种代理@4 pf.addAdvisor(advisor); pf.setTarget(s); proxy = (Service)pf.getProxy(); proxy .doSomething();
1、七种PointCut实现
Perl5RegexpMethodPointcut
是一个最基本的正则表达式切入点, 它使用Perl 5正则表达式语法。Perl5RegexpMethodPointcut
依赖Jakarta ORO进行正则表达式匹配。
JdkRegexpMethodPointcut 类,它使用JDK 1.4或更高版本里提供的正则表达式支持。
RegexpMethodPointcutAdvisor
, 它也允许我们引用一个通知(记住这里一个通知可以是拦截器,前置通知(before advice),异常通知(throws advice)等类型中的一个)。 在背后,如果使用J2SE 1.4或者以上版本,Spring将使用JdkRegexpMethodPointcut
, 在之前版本的虚拟机上,Spring将退回去使用Perl5RegexpMethodPointcut
。 可以通过设置perl5
属性为true来强制使用Perl5RegexpMethodPointcut
。 使用RegexpMethodPointcutAdvisor
可以简化织入,因为一个bean可以同时作为切入点和通知器(advisor),如下所示:
<bean id="settersAndAbsquatulateAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice"> <ref local="beanNameOfAopAllianceInterceptor"/> </property> <property name="patterns"> <list> <value>.*set.*</value> <value>.*absquatulate</value> </list> </property> </bean>
ControlFlowPointcut在运行时控制流切入点的开销是非常昂贵的,甚至与其它动态切入点比起来也是如此。在Java 1.4里, 它的开销差不多是其它动态切入点的5倍。
StaticMethodMatcherPointcut
因为静态切入点是最常用的,你可能会像下面那样继承StaticMethodMatcherPointcut。这只需要实现一个抽象方法 (虽然也可以覆盖其它方法来定制行为):
class TestStaticPointcut extends StaticMethodMatcherPointcut { public boolean matches(Method m, Class targetClass) { // return true if custom criteria match } }
ComposablePointCut可组合切入点。可通过union()和intersection()等操作组合两个以上的切入点。
DynamicMethodMatcherPointcut流程切入点。
动态切入和静态切入:
public interface Pointcut { ClassFilter getClassFilter(); MethodMatcher getMethodMatcher(); } public interface ClassFilter { boolean matches(Class clazz); } public interface MethodMatcher { boolean matches(Method m, Class targetClass); boolean isRuntime(); boolean matches(Method m, Class targetClass, Object[] args); }
matches(Method, Class)
方法用来测试这个切入点是否匹配目标类的指定方法。 这将在AOP代理被创建的时候进行运算,这样可以避免在每次方法调用的时候都运算。 如果matches(Method, Class)
对于一个给定的方法返回true,并且isRuntime()
也返回true, 那么matches(Method, Class, Object[])
将在每个方法调用的时候被调用。 这使得切入点在通知将被执行前可以查看传入到方法的参数。
大多数MethodMatcher是静态的,这意味着isRuntime()
方法返回false。 在这种情况下,matches(Method, Class , Object[])
永远不会被调用。
如果是静态切入,Spring会针对目标上的每一个方法调用一次matches(Method m, Class targetClass),其返回值被缓冲起来方便日后调用该方法时使用。这样,对每个方法的适用性测试只会进行一次,之后调用该方法时不全再调用matches()。
2、五种通知
MethodInterceptor拦截环绕通知
public interface MethodInterceptor extends Interceptor { Object invoke(MethodInvocation invocation) throws Throwable; }
BeforeAdvice 前置通知
public interface MethodBeforeAdvice extends BeforeAdvice { void before(Method m, Object[] args, Object target) throws Throwable; }
AfterReturningAdvice 后置通知
public interface AfterReturningAdvice extends Advice { void afterReturning(Object returnValue, Method m, Object[] args, Object target) throws Throwable; }
ThrowsAdvice异常通知
public interface ThrowsAdviceextends AfterAdvice{ afterThrowing([Method, args, target], subclassOfThrowable) }
IntroductionInterceptor 引入通知
public interface IntroductionInterceptor extends MethodInterceptor { boolean implementsInterface(Class intf); }
调用的方法位于一个已经被引入接口里,这个引入拦截器将负责完成对这个方法的调用--因为它不能调用proceed()
方法。引入通知不能和任何切入点一起使用,因为它是应用在类级别而不是方法级别。 你只能通过
IntroductionAdvisor来使用引入通知,这个接口包括下面的方法:
public interface IntroductionAdvisor extends Advisor, IntroductionInfo { ClassFilter getClassFilter(); void validateInterfaces() throws IllegalArgumentException; } public interface IntroductionInfo { Class[] getInterfaces(); }
这里没有MethodMatcher
接口,因此也就没有 Pointcut
与引入通知相关联。这里只进行类过滤。
getInterfaces()
方法返回这个通知器所引入的接口。
validateInterfaces()
方法将被内部使用来查看被引入的接口是否能够由配置的IntroductionInterceptor
来实现。
3、三个通知者类
DefaultPointcutAdvisor
在Spring里,一个Advisor是一个仅仅包含一个通知对象和与之关联的切入点表达式的切面。
除了引入这种特殊形式,任何通知器(advisor)都可以和任何通知一起工作。 org.springframework.aop.support.DefaultPointcutAdvisor
是最常用的通知器类。例如,它可以和 MethodInterceptor
,BeforeAdvice
或者 ThrowsAdvice
一起使用。
在Spring里有可能在同一个AOP代理里混合通知器和通知类型。 例如,你可以在一个代理配置里使用一个拦截环绕通知,一个异常通知和一个前置通知:Spring将负责自动创建所需的拦截器链。
RegexpMethodPointcutAdvisor
StaticMethodMatcherPointcutAdvisor
4.1、三个代理实现类
BeanNameAutoProxyCreator为名字匹配字符串或者通配符的bean自动创建AOP代理。
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <value>jdk*,onlyJdk</value> </property> <property name="interceptorNames"> <list> <value>myInterceptor</value> </list> </property> </bean>
DefaultAdvisorAutoProxyCreator
它自动应用当前上下文中适当的通知器,无需在自动代理通知器的bean定义中包括bean的名字。 比起BeanNameAutoProxyCreator
,它提供了同样关于一致性配置的优点而避免了前者的重复性。
使用这个功能将涉及:
-
Specifying a
DefaultAdvisorAutoProxyCreator
bean definition.说明一个
DefaultAdvisorAutoProxyCreator
的bean定义 -
在同一个或者相关的上下文中说明任意数量的通知器。注意这些必须 是通知器而不仅仅是拦截器或者其它通知。 这点是必要的因为必须有一个切入点被评估,以便检查每个通知候选bean定义的合适性。
DefaultAdvisorAutoProxyCreator
将自动评估包括在每个通知器中的切入点,
AbstractAdvisorAutoProxyCreator
这是DefaultAdvisorAutoProxyCreator的父类。如果在某些情况下框架提供的DefaultAdvisorAutoProxyCreator
不能满足你的需要,你可以通过继承这个类来创建你自己的自动代理创建器。
4.2、两种代理支持
JKD动态代理
java.lang.reflect.Proxy.getProxyClass(loader, interfaces). getConstructor(new Class[] { InvocationHandler.class }). newInstance(new Object[] { handler });
CGLIB基于ASM框架生成字节码
1、首次创建CGLIB代理时,CGLIB会询问Spring每个方法应该如何处理。这意味着很多决定在JDK代理中每次invoke()调用时都要进行,但在CGLIB中只需要进行一次。CGLIB可以直接调用未被通知的方法,但JDK动态代理要去判断。
2、对于固定通知链的通知,CGLIB可以优化执行。
3、CGLIB对于被代理的方法,也使用了生成字节码的能力,执行被代理方法效率比JDK代理略微高。
发表评论
-
Spring 框架的设计理念与设计模式分析
2011-07-20 16:23 859http://www.ibm.com/developerwor ... -
struts1.2和2.0
2011-07-14 13:33 864WebWork 2 : 与Struts的比较 Th ... -
Struts1和Struts2的区别
2009-12-30 16:13 784Action 类: ◆Struts1要求Action类继承 ... -
WebWork概述
2009-12-30 16:12 794WebWork是建立在称为XWork的Command模式框架之 ... -
IBATIS缓存
2009-12-23 17:56 822iBATIS可以在Mapped Statement ... -
IOC实现原理
2009-12-16 21:03 1590对Spring IOC的理解离不开 ... -
spring的AOP理论
2009-12-16 13:01 873AOP术语:http://kang.iteye.com/blo ... -
Hibernate悲观锁和乐观锁
2009-12-16 12:57 919锁 ( locking ) 业务逻辑的实现过程中,往 ... -
webService理论和XFire
2009-12-14 15:42 878http://in3040.blog.163.com/blog ... -
Hibernate理论
2009-12-13 15:14 838hibernate对JPA支持:http:// ... -
EJB理论3.0
2009-12-11 15:08 784在已经提交的EJB3.0规范 ... -
WebService实现包--AXIS2
2009-12-11 14:48 1552深度探索 Axis2:AXIOM: http://ww ... -
EJB理论
2009-12-11 14:36 8371、EJB与JAVA BEAN的区别 ... -
RMI理论
2009-12-11 11:06 798一、RMI系统运行机理 RMI应用程序通常包括两个 ... -
RMI应用的实现例子1和spring实现的RMI例子2
2009-12-11 10:11 3592一个正常工作的RMI系统由下面几个部分组成: ● 远 ... -
spring2.5中的@注释配置
2009-12-10 20:01 979下面这篇文章写得很更清晰 http://haowei0315 ... -
AOP的JDK and CGLib 动态代理 示例
2009-12-09 16:50 1015package com.proxy; public ... -
AOP例子(spring配置实现)
2009-12-07 13:13 1747此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没 ... -
AOP理论
2009-12-07 11:45 814原文地址:http://dev.csdn. ... -
AOP生成代码三种方式
2009-06-05 09:44 1105AOP生成代码有三种可能方式: (1)静态编译时期,源代码生 ...
相关推荐
3. **最佳实践与陷阱避免:**作者通过丰富的实战经验总结了一系列AOP应用的最佳实践方法,并指出了常见的开发陷阱。 4. **代码编织策略:**对比分析了不同的代码编织策略(如编译时、类加载时、运行时等)以及它们的...
总结,Spring AOP结合Spring MVC,使得我们可以灵活地在不修改业务代码的情况下,实现跨切面的关注点,提高了代码的可维护性和复用性。通过注解配置,AOP的使用变得更加简洁,降低了学习和使用的门槛。
Spring AOP(面向切面编程)是Spring框架中的一个重要组成部分,它允许开发者通过定义切面来实现代码的解耦和模块化。AOP的核心概念包括切面、通知、连接点、切入点、织入等,这些概念帮助我们实现横切关注点的分离...
总结一下,Spring的AOP机制通过JDK动态代理和CGLIB动态代理提供了强大的横切关注点管理功能。开发者可以轻松地定义切面和通知,以实现如日志、事务管理等功能,同时保持核心业务代码的清晰和简洁。在Spring Boot项目...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现横切关注点,如日志、事务管理、性能监控等,而无需侵入业务代码。下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### ...
在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们定义横切关注点,如日志、事务管理、权限检查等,然后将这些关注点与核心业务逻辑解耦。这篇教程将详细讲解...
总结起来,Spring AOP在Spring Framework中的应用广泛且深入,不仅在事件处理、事务管理中起到关键作用,还涉及缓存和调度等其他核心功能。理解和掌握这些应用,对于提升Spring框架的使用水平和开发效率至关重要。
Spring框架是Java开发中不可或缺的一部分,它通过引入依赖注入(IOC)和面向切面编程(AOP)的概念,极大地简化了应用程序的构建和管理。在本文中,我们将深入探讨Spring的IOC容器和AOP的核心概念,以及如何进行相关...
总结一下,Spring AOP提供了一种优雅的方式来处理系统的横切关注点,如日志记录、事务管理或性能监控。通过定义切点、创建切面和配置通知,我们可以实现代码的解耦,提高可维护性和复用性。这个例子提供了学习Spring...
总结起来,"spring-aop-jar"涉及了Spring框架中的面向切面编程模块,包括Spring AOP和AspectJ的集成。通过理解和熟练使用这些组件,开发者可以有效地解耦关注点,提高代码的可维护性和可扩展性。在实际项目中,结合...
### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)逐渐暴露出难以应对某些横切关注点(cross-cutting concerns)的问题。为了解决这一挑战,面向方面编程...
总结,Spring框架的AOP机制,尤其是动态代理中的JDK和CGLIB,为我们的代码带来了更高的可维护性和可扩展性。同时,Spring整合Mybatis让开发者可以更专注于业务逻辑,而不是繁琐的数据库操作。了解并熟练掌握这些知识...
《深入解析Spring AOP:源码解读与应用实践》 Spring AOP,即Spring的面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或统一处理的方法。本文将围绕Spring AOP...
总结一下,Spring基于AOP实现的事务管理通过TransactionProxyFactoryBean,结合声明式事务配置,能够提供一种高效且易于维护的事务解决方案。它允许我们在不修改业务逻辑的情况下,统一管理和控制事务,提升了代码的...
**Spring AOP 概述** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它允许我们在不修改已有代码的情况下,通过添加额外的行为来增强对象的功能。AOP的核心概念包括...
总结来说,Spring 3.0.5通过AOP提供对`HttpServletResponse`的扩展支持,允许开发者在不侵入业务逻辑的情况下,灵活地控制HTTP响应。这种能力对于实现诸如日志记录、性能监控、异常处理、安全性控制等跨切面的功能...
**Spring AOP 概述** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了在不修改源代码的情况下,对应用程序进行功能增强的能力。AOP通过将关注点(如日志、...
spring AOP 理论知识点总结.wpsspring AOP 理论知识点总结.wpsspring AOP 理论知识点总结.wps
总结,Spring AOP提供了一种优雅的方式,让我们能够分离关注点,实现代码的模块化,提高可维护性和复用性。理解并熟练运用这些概念和机制,可以极大地提升我们的开发效率和代码质量。通过学习和实践,你可以更好地在...