`

AOP总结(spring)

阅读更多

实现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 是最常用的通知器类。例如,它可以和 MethodInterceptorBeforeAdvice 或者 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代理略微高。

 

分享到:
评论

相关推荐

    AspectJ in Action: Enterprise AOP with Spring Applications

    3. **最佳实践与陷阱避免:**作者通过丰富的实战经验总结了一系列AOP应用的最佳实践方法,并指出了常见的开发陷阱。 4. **代码编织策略:**对比分析了不同的代码编织策略(如编译时、类加载时、运行时等)以及它们的...

    基于注解配置和使用spring AOP(spring mvc框架)

    总结,Spring AOP结合Spring MVC,使得我们可以灵活地在不修改业务代码的情况下,实现跨切面的关注点,提高了代码的可维护性和复用性。通过注解配置,AOP的使用变得更加简洁,降低了学习和使用的门槛。

    Spring AOP总结

    Spring AOP(面向切面编程)是Spring框架中的一个重要组成部分,它允许开发者通过定义切面来实现代码的解耦和模块化。AOP的核心概念包括切面、通知、连接点、切入点、织入等,这些概念帮助我们实现横切关注点的分离...

    spring之AOP(动态代理)

    总结一下,Spring的AOP机制通过JDK动态代理和CGLIB动态代理提供了强大的横切关注点管理功能。开发者可以轻松地定义切面和通知,以实现如日志、事务管理等功能,同时保持核心业务代码的清晰和简洁。在Spring Boot项目...

    spring aop注解方式、xml方式示例

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现横切关注点,如日志、事务管理、性能监控等,而无需侵入业务代码。下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### ...

    使用Spring配置文件实现AOP

    在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们定义横切关注点,如日志、事务管理、权限检查等,然后将这些关注点与核心业务逻辑解耦。这篇教程将详细讲解...

    第五章:Spring AOP 在 Spring Framework 内部应用1

    总结起来,Spring AOP在Spring Framework中的应用广泛且深入,不仅在事件处理、事务管理中起到关键作用,还涉及缓存和调度等其他核心功能。理解和掌握这些应用,对于提升Spring框架的使用水平和开发效率至关重要。

    springIOC与AOP配置

    Spring框架是Java开发中不可或缺的一部分,它通过引入依赖注入(IOC)和面向切面编程(AOP)的概念,极大地简化了应用程序的构建和管理。在本文中,我们将深入探讨Spring的IOC容器和AOP的核心概念,以及如何进行相关...

    Spring AOP完整例子

    总结一下,Spring AOP提供了一种优雅的方式来处理系统的横切关注点,如日志记录、事务管理或性能监控。通过定义切点、创建切面和配置通知,我们可以实现代码的解耦,提高可维护性和复用性。这个例子提供了学习Spring...

    spring-aop-jar

    总结起来,"spring-aop-jar"涉及了Spring框架中的面向切面编程模块,包括Spring AOP和AspectJ的集成。通过理解和熟练使用这些组件,开发者可以有效地解耦关注点,提高代码的可维护性和可扩展性。在实际项目中,结合...

    Spring AOP面向方面编程原理:AOP概念

    ### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)逐渐暴露出难以应对某些横切关注点(cross-cutting concerns)的问题。为了解决这一挑战,面向方面编程...

    Spring框架,AOP,Spring整合Mybatis

    总结,Spring框架的AOP机制,尤其是动态代理中的JDK和CGLIB,为我们的代码带来了更高的可维护性和可扩展性。同时,Spring整合Mybatis让开发者可以更专注于业务逻辑,而不是繁琐的数据库操作。了解并熟练掌握这些知识...

    spring-aop.rar_aop1270_spring_spring aop

    《深入解析Spring AOP:源码解读与应用实践》 Spring AOP,即Spring的面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或统一处理的方法。本文将围绕Spring AOP...

    spring基于AOP实现事务

    总结一下,Spring基于AOP实现的事务管理通过TransactionProxyFactoryBean,结合声明式事务配置,能够提供一种高效且易于维护的事务解决方案。它允许我们在不修改业务逻辑的情况下,统一管理和控制事务,提升了代码的...

    Spring Aop 引用新功能 源码

    **Spring AOP 概述** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它允许我们在不修改已有代码的情况下,通过添加额外的行为来增强对象的功能。AOP的核心概念包括...

    Spring3.0.5扩展支持AOP获取HttpServletResponse

    总结来说,Spring 3.0.5通过AOP提供对`HttpServletResponse`的扩展支持,允许开发者在不侵入业务逻辑的情况下,灵活地控制HTTP响应。这种能力对于实现诸如日志记录、性能监控、异常处理、安全性控制等跨切面的功能...

    AOP的Spring包

    **Spring AOP 概述** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了在不修改源代码的情况下,对应用程序进行功能增强的能力。AOP通过将关注点(如日志、...

    spring AOP 理论知识点总结.wps

    spring AOP 理论知识点总结.wpsspring AOP 理论知识点总结.wpsspring AOP 理论知识点总结.wps

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    总结,Spring AOP提供了一种优雅的方式,让我们能够分离关注点,实现代码的模块化,提高可维护性和复用性。理解并熟练运用这些概念和机制,可以极大地提升我们的开发效率和代码质量。通过学习和实践,你可以更好地在...

Global site tag (gtag.js) - Google Analytics