Spring AOP 定义切入点
来源:互联网 发布:南京软件测试工资待遇 编辑:程序博客网 时间:2024/04/29 07:20
首先我们编写了通知advice,但是我们还不能表达在应用系统的什么地方应用这些通知,切入点决定了一个特定类的特定方法是否满足特定规则,如果满足则通知就应用到该方法上,Spring的切入点可以让我们灵活的定义在什么地方应用通知。
Spring的切入点框架的核心接口PointCut
PointCut 是根据方法和类决定在什么地方织入通知的。
ClassFilter决定了一个类是否符合通知的要求
实现了这个接口的类决定了以参数传进来的类是否应该被通知,它相当于一个类的过滤器,一般根据类名过滤,另外这个接口总是包含一个简单的ClassFilter的实现ClassFilter.TRUE,它是规范任何类的ClasFilter实例,它适用于只创建只根据方法来决定是否是应用通知的切入点。
MethodMether决定了一个类的一个方法是否符合通知的要求
Advisor
大多数的切面由通知和切入点组成,因此Spring把advice和pointcut组合为一个对象,PointcutAdvisor
静态/动态切入点比较
静态切入点只在代理被创建的时候执行一次,而不是在运行期间每次方法调用都执行,因此性能比动态切入点好,因此静态切入点是我们的首选,Spring为创建静态切入点提供了父类StaticMethodMatcherPointcut,继承它并实现isMatch方法就可以了
Spring提供的静态切入点
(1)NameMatchMethodPointcut
这个类有2个主要方法:
事例:
有一个接口类 MyInterfaceA ,包含3个方法,set1,set2,get3 ,有一个实现类MyClassAImpl;我们想配置set方法的切入点,如下实现:
(2)RegexpMethodPointcut正则表达式切入点
整个过程同上,但在配置切面时有所不同,见蓝色部分代码
正则表达式:
.:匹配任何单个字符 例如:setF. 匹配setFi,但不匹配setF 和 setFii
+:匹配前一个字符一次或者多次,例如setF.+ 匹配setFBar和setFB,不匹配setF
*:匹配前一个字符0次或者多次,例如setF.* ,同上并匹配setF
\:匹配任何正则表达式符号,例如\.setF ,匹配bar.setF ,不匹配setF
Spring的切入点框架的核心接口PointCut
- public interface PointCut {
- ClassFilter getClassFilter();
- MethodMatcher getMethodMatcher();
- }
- public interface PointCut {
- ClassFilter getClassFilter();
- MethodMatcher getMethodMatcher();
- }
PointCut 是根据方法和类决定在什么地方织入通知的。
ClassFilter决定了一个类是否符合通知的要求
- public interface ClassFilter{
- boolean matches(Class clazz);//根据类名判断
- }
- public interface ClassFilter{
- boolean matches(Class clazz);//根据类名判断
- }
实现了这个接口的类决定了以参数传进来的类是否应该被通知,它相当于一个类的过滤器,一般根据类名过滤,另外这个接口总是包含一个简单的ClassFilter的实现ClassFilter.TRUE,它是规范任何类的ClasFilter实例,它适用于只创建只根据方法来决定是否是应用通知的切入点。
MethodMether决定了一个类的一个方法是否符合通知的要求
- public interface MethodMether{
- //决定一个类的一个方法是否被通知,AOP代理被创建的时候,调用一次这个方法,这个方法的结果决定了是否应用通知
- boolean mathces(Method m,Class target);
- //决定MethodMether是静态还是动态,静态:false,通知总是被执行,动态true:根据运行时方法的参数值决定通知是否被执行。
- public boolean isRuntime();
- //如果是静态切入点,此方法不会被调用
- //如果是动态切入点,目标对象方法每次被调用的时候,此方法被调用。
- public boolean matches(Method m,Class target,Object arg[]);
- }
- public interface MethodMether{
- //决定一个类的一个方法是否被通知,AOP代理被创建的时候,调用一次这个方法,这个方法的结果决定了是否应用通知
- boolean mathces(Method m,Class target);
- //决定MethodMether是静态还是动态,静态:false,通知总是被执行,动态true:根据运行时方法的参数值决定通知是否被执行。
- public boolean isRuntime();
- //如果是静态切入点,此方法不会被调用
- //如果是动态切入点,目标对象方法每次被调用的时候,此方法被调用。
- public boolean matches(Method m,Class target,Object arg[]);
- }
Advisor
大多数的切面由通知和切入点组成,因此Spring把advice和pointcut组合为一个对象,PointcutAdvisor
- public interface PointcutAdvisor{
- PointCut getPointCut();
- Advice getAdvice();
- }
- //大多数的Spring自带的切入点都有一个对应的PointcutAdvisor.
- public interface PointcutAdvisor{
- PointCut getPointCut();
- Advice getAdvice();
- }
- //大多数的Spring自带的切入点都有一个对应的PointcutAdvisor.
静态/动态切入点比较
静态切入点只在代理被创建的时候执行一次,而不是在运行期间每次方法调用都执行,因此性能比动态切入点好,因此静态切入点是我们的首选,Spring为创建静态切入点提供了父类StaticMethodMatcherPointcut,继承它并实现isMatch方法就可以了
Spring提供的静态切入点
(1)NameMatchMethodPointcut
这个类有2个主要方法:
- public void setMappedName(String name)
- public void setMappedNames(String[] names)
- public void setMappedName(String name)
- public void setMappedNames(String[] names)
事例:
有一个接口类 MyInterfaceA ,包含3个方法,set1,set2,get3 ,有一个实现类MyClassAImpl;我们想配置set方法的切入点,如下实现:
- <beans>
- //目标对象
- <bean id="MyClassATarget" class="MyClassAImpl"></bean>
- //通知
- <bean id="myAdvice" class="..."></bean>
- //定义切面
- <bean id="myAdvisor" class="....NameMatchMethodPointcut">
- //方法过滤,注入切入点
- <property name="mappedName">
- <value>set*</value>
- </property>
- //注入通知
- <property name="advice">
- <ref bean="myAdvice"/>
- <property>
- </bean>
- //配置代理
- <bean id="MyClassAProxy" class=".....ProxyFactoryBean">
- //代理的接口
- <property name="proxyInterfaces">
- <value>MyInterfaceA</value>
- <property>
- //配置切面
- <property name="interceptorNames">
- <list>
- <value>myAdvisor</value>
- </list>
- <property>
- //配置目标对象
- <property name="target">
- <ref bean="MyClassATarget"/>
- <property>
- </bean>
- </beans>
- //整个过程可以如下几步:
- 1 编写接口:myinterface
- 2 编写接口的实现myImpl并配置为bean:myImplTarget
- 3 编写通知myAdvice并配置为bean:myAdvice
- 4 配置切面myAdvisor,切面中注入切入点(set*)和通知myAdvice
- 5 配置代理myImplProxy,注入接口类myinterface,注入切面myAdvisor,注入目标对 象myImplTarget
- <beans>
- //目标对象
- <bean id="MyClassATarget" class="MyClassAImpl"></bean>
- //通知
- <bean id="myAdvice" class="..."></bean>
- //定义切面
- <bean id="myAdvisor" class="....NameMatchMethodPointcut">
- //方法过滤,注入切入点
- <property name="mappedName">
- <value>set*</value>
- </property>
- //注入通知
- <property name="advice">
- <ref bean="myAdvice"/>
- <property>
- </bean>
- //配置代理
- <bean id="MyClassAProxy" class=".....ProxyFactoryBean">
- //代理的接口
- <property name="proxyInterfaces">
- <value>MyInterfaceA</value>
- <property>
- //配置切面
- <property name="interceptorNames">
- <list>
- <value>myAdvisor</value>
- </list>
- <property>
- //配置目标对象
- <property name="target">
- <ref bean="MyClassATarget"/>
- <property>
- </bean>
- </beans>
- //整个过程可以如下几步:
- 1 编写接口:myinterface
- 2 编写接口的实现myImpl并配置为bean:myImplTarget
- 3 编写通知myAdvice并配置为bean:myAdvice
- 4 配置切面myAdvisor,切面中注入切入点(set*)和通知myAdvice
- 5 配置代理myImplProxy,注入接口类myinterface,注入切面myAdvisor,注入目标对 象myImplTarget
(2)RegexpMethodPointcut正则表达式切入点
整个过程同上,但在配置切面时有所不同,见蓝色部分代码
- //定义切面
- <bean id="myAdvisor" class="....RegexpMethodPointcut">
- //方法过滤,注入切入点
- [color=blue]<property name="pattern">
- <value>.*get.+By.+</value>
- </property>[/color] //注入通知
- <property name="advice">
- <ref bean="myAdvice"/>
- <property>
- </bean>
- //定义切面
- <bean id="myAdvisor" class="....RegexpMethodPointcut">
- //方法过滤,注入切入点
- [color=blue]<property name="pattern">
- <value>.*get.+By.+</value>
- </property>[/color] //注入通知
- <property name="advice">
- <ref bean="myAdvice"/>
- <property>
- </bean>
正则表达式:
.:匹配任何单个字符 例如:setF. 匹配setFi,但不匹配setF 和 setFii
+:匹配前一个字符一次或者多次,例如setF.+ 匹配setFBar和setFB,不匹配setF
*:匹配前一个字符0次或者多次,例如setF.* ,同上并匹配setF
\:匹配任何正则表达式符号,例如\.setF ,匹配bar.setF ,不匹配setF
0 0
- Spring AOP 定义切入点
- Spring AOP 定义切入点
- Spring AOP(七)之定义切入点
- spring aop 切入点
- Spring AOP切入点表达式
- Spring AOP 切入点表达式
- Spring中的AOP(六)——定义切入点和切入点指示符
- Spring中的AOP(五)——定义切入点和切入点指示符
- Spring AOP切面实现:定义切入点语法和切入点指示符
- Spring中的AOP(五)——定义切入点和切入点指示符
- Spring AOP execution 切入点表达式
- spring aop 复习 .2 切入点
- Spring AOP execution 切入点表达式
- Spring AOP概念及切入点
- Spring Aop 切入点表达式解析
- Spring AOP 切入点表达式使用
- Spring AOP 切入点常用表达式
- spring AOP切入点表达式规则
- “DataTable”是“System.Data.DataTable”和“Microsoft.Office.Interop.Excel.DataTable”之间的不明确的引用
- poj 2051 priority_queue应用
- RxJava系列之二 变换类操作符详解1
- /etc/sysconfig/目录详解
- 1062. Talent and Virtue (25)
- Spring AOP 定义切入点
- springboot 开发入门,及问题汇总
- 谁让APP工程师产生了泡沫?
- Java 内部类种类及使用解析
- Android 多线程处理之多线程用法大集合 第 1 页
- data-*自定义属性
- CSS 单行溢出文本显示省略号...的方法(兼容IE FF)
- POJ_2752_SeekTheName,SeekTheFame
- Apache 和 nginx 之间的配置