切面 = 增强 + 切点(连接点为目标类的特定方法)
切面 = 增强(连接点为目标类的所有方法)
增强包含连接点的方位和织入代码,切点包含执行点信息(哪些类的哪些方法)
切点
org.springframework.aop.Pointcut接口描述切点
Pointcut由ClassFilter和MethodMatcher构成
ClassFilter
定位到特定类上
matches(Class clazz)用来判别被检测的类是否匹配过滤条件
MethodMatcher
定位到特定方法上
matches(Method m,Class targetClass)静态方法匹配器,匹配方法签名,仅一次
matches(Method m,Class targetClass,Object[] args)动态方法匹配器,在运行期检查方法入参的值,每次调用都匹配
isRuntime()返回false表示静态方法匹配器,返回true表示动态方法匹配器
切点类型
静态方法切点
抽象基类org.springframework.aop.support.StaticMethodMatcherPointcut默认匹配所有类
子类NameMatchMethodPointcut字符串匹配
子类AbstractRegexpMethodPointcut正则匹配
动态方法切点
抽象基类org.springframework.aop.support.DynamicMethodMatcherPointcut默认匹配所有类,已过时,可用DefaultPointCutAdvice和DynamicMethodMatcherPointcut替代。
注解切点
org.springframework.aop.support.annotation.AnnotationMatchingPointcut支持在Bean中直接通过JDK5.0注解标签定义的切点
表达式切点
org.springframework.aop.support.ExpressionPointcut支持AspectJ切点表达式
流程切点
org.springframework.aop.support.ControlFlowPointcut根据程序执行的堆栈信息查看目标方法是否由某一个方法直接或间接发起调用,以此判断是否为匹配的连接点。
复合切点
org.springframework.aop.support.ComposablePointcut可创建多个切点
切面类型
Advice
一般切面,仅包含Advice,连接点是目标类的所有方法。
PointcutAdvice
切点切面,包含Advice和Pointcut,连接点是目标类的特定方法。
IntroductionAdvice
引介切面,包含IntroductionInterceptor和Pointcut,类级别。
静态普通方法名匹配切面
定义切点
public class GreetingAdvisor extends StaticMethodMatcherPointcut{
public boolean matches(Method method, Class clazz){//切点方法
return "greetTo".equals(method.getName());
}
public ClassFilter getClassFilter(){//切点类
return new ClassFilter(){
public boolean matcher(Class clazz){
return Waiter.class.isAssignableFrom(clazz);
}
}
}
}
定义增强
public class GreetingBeforeAdvice implements MethodBeforeAdvice{
public void before(Method method, Object[] args, Object obj) throws Throwable{
//...
}
}
配置切面
<!-- 目标类 -->
<bean id="waiterTarget" class="com.smart.advisor.Waiter" />
<bean id="sellerTarget" class="com.smart.advisor.Seller" />
<!-- 前置增强 -->
<bean id="beforeAdvice" class="com.smart.advisor.GreetingBeforeAdvice" />
<!-- 切面,advice-增强,classFilter-类匹配过滤器,order-切面织入时的顺序 -->
<bean id="greetingAdvisor" class="com.smart.advisor.GreetingAdvisor"
p:advice-ref="beforeAdvice"/>
<!-- 父bean,定义公共配置信息 -->
<bean id="parent" abstract="true"
class="org.springframework.ProxyFactoryBean"
p:interceptorNames="greetingAdvisor"
p:proxyTargetClass="true"/>
<!-- 代理bean -->
<bean id="waiter" parent="parent" p:tartget-ref="waiterTarget"/>
<bean id="seller" parent="parent" p:tartget-ref="sellerTarget"/>
静态正则表达式方法匹配切面
<!-- 匹配目标类方法的全限定名 -->
<bean id="regexpAdvisor"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
p:advice-ref="beforeAdvice">
<property name="patterns">
<list><value>.*greet.*</value></list>
</property>
</bean>
<bean id="parent" class="org.springframework.ProxyFactoryBean"
p:interceptorNames="greetingAdvisor"
p:target-ref="waiterTarget"
p:proxyTargetClass="true"/>
分享到:
相关推荐
spring AOP切面编程 运行环境:eclipse 构建工具:maven 不提供maven构建,maven用来解决jar包的依赖
spring aop切面拦截指定类和方法实现流程日志跟踪 一般情况下,在不侵入业务代码的情况下,需要做流程日志跟踪是比较合理的 采用springaop切面思想
学习Spring开发的AOP面向切面编程时所需要的jar包,包括com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
spring AOP 切面日志 分层打日志
spring aop 自定义切面示例 aspectj 需要相应的架包支持
spring aop切面编程需要aspectjweaver-1.5.3.jar aspectj-1.9.6.jar aspectjrt-1.7.4.jar
最近公司要求和别的公司对接,但是不想破坏原有的架构,就只有用切面了,百度了下都不全面,就自己写了个小demo,只要导入spring4.2.3的jar就直接可以用,注解实现spingaop机制,1分意思下
内含有mybatis 拦截器实现的分页代码,spring 的事务和aop 测试、和反射工具类
2、面向切面编程AOP 在实现过程中,我尽量贴近实际开发与场景,麻雀虽小,五脏俱全,个人感觉这个项目是web框架搭建的一个极简之道实践。 项目中可能还存在很多的问题,希望大家不吝赐教,谢谢。
此工程为使用eclipse创建java project,使用jdk1.8,项目中包含完整的代码和jar包,导入eclipse即可运行
NULL 博文链接:https://sunzone.iteye.com/blog/1967543
Spring 动态代理和aop切面编程例子,自己写的例子!!!!!!!
深入讲解Spring应用中重要的一部分AOP--面向切面编程
Spring mvc mybatis plus 实现AOP 切面日志系统,带有数据库。可以自行拓展
实现一个简单的spring aop切面,并对切点以及切面操作进行测试,内附代码和截图
Spring AOP切面解决数据库读写分离实例详解 为了减轻数据库的压力,一般会使用数据库主从(master/slave)的方式,但是这种方式会给应用程序带来一定的麻烦,比如说,应用程序如何做到把数据写到master库,而读取数据...
AOP切面的实践 下面是一个在spring mvc中关于切面如何使用的例子,可以指直观的理解切面到底有什么作用 1、引用 AspectJ jar 包依赖 pom.xml 文件添加依赖 org.aspectj aspectjrt 1.9.2 2、创建两个新的包 ...
spring切面AOP所使用的jar包
NULL 博文链接:https://zyssnh.iteye.com/blog/1866867