
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
昆明达内培训的老师今天给大家讲关于顾问(Advisor)实现前置增强
通知Advice是Spring提供的一种切面(Aspect)。
但其功能过于简单,只能将切面织入到目标类的所有目标方法中,无法完成将切面织入到指定目标方法中。
顾问Advisor是Spring提供的另一种切面。其可以完成更为复杂的切面织入功能。昆明达内培训的老师知道PointcutAdvisor是顾问的一种,可以指定具体的切入点。顾问将通知进行了包装,会根据不同的通知类型,在不同的时间点,将切面织入到不同的切入点。
PointcutAdvisor接口有两个较为常用的实现类:
*:NameMatchMethodPointcutAdvisor名称匹配方法切入点顾问
*:RegexpMethodPointcutAdvisor正则表达式匹配方法切入点顾问
<property ame="pattern" value=".*do.*"></property>表示方法全名(包名,接口名,方法名)
运算符名称意义
.点号表示任意单个字符
+加号表示前一个字符出现一次或者多次
*星号表示前一个字符出现0次或者多次
=====默认Advisor自动代理生成器
DefaultAdvisorAutoProxyCreator
=====BeanName自动代理生成器
BeanNameAutoProxyCreator
源码介绍:
1.ISomeService.java
package service;
//接口
public interface ISomeService {
//待实现的方法
public void doFirst();
public void doSecond();
}
2.SomeServiceImpl.java
package service;
//接口实现类
public class SomeServiceImpl implements ISomeService {
//实现接口定义的方法
@Override
public void doFirst() {
System.out.println("方法A");
}
@Override
public void doSecond() {
System.out.println("方法B");
}
}
3.MyMethodBeforeAdvice.java
package aop;
//前置增强
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class MyMethodBeforeAdvice implements MethodBeforeAdvice{
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println("目标方法执行之前执行");
}
}
4.applicationContext.xml(Spring配置文件)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="#/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="#/schema/context"
xsi:schemaLocation="
#/schema/beans #/schema/beans/spring-beans.xsd
#/schema/context #/schema/context/spring-context.xsd">
<!--目标对象-->
<bean id="someService" class="service.SomeServiceImpl"></bean>
<!--切面:通知-->
<bean id="beforeAdvice" class="aop.MyMethodBeforeAdvice"></bean>
<!-- *********************************************** -->
<!-- 1.*:NameMatchMethodPointcutAdvisor名称匹配方法切入点顾问-->
<!--切面:顾问顾问(Advisor)要包装通知(Advice)-->
<bean id="beforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="beforeAdvice"></property>
<!--指定需要增强的方法:这里是doFirst()方法,而doSecond()方法则不会增强 -->
<property ame="mappedName" value="doFirst"></property>
<!--也可以使用mappedNames指定多个方法
<property ame="mappedNames" value="doFirst,doSecond"></property>
-->
</bean>
<!-- *********************************************** -->
<!-- 2.*:RegexpMethodPointcutAdvisor正则表达式匹配方法切入点顾问-->
<!--切面:顾问顾问(Advisor)要包装通知(Advice)-->
<!-- <bean id="beforeAdvisor"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="beforeAdvice"></property>
<property name="pattern" value=".*doF.*t"></property>
</bean> -->
<!-- *********************************************** -->
<!--代理工厂Bean -->
<bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="someService"></property>
<property ame="interceptorNames" value="beforeAdvisor"></property>
</bean>
</beans>
5.MyTest.java
package test;
//对顾问(Advisor)测试
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.ISomeService;
public class MyTest {
@Test
public void testOne(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
ISomeService service = (ISomeService)ctx.getBean("serviceProxy");
service.doFirst();
service.doSecond();
}
}
昆明达内IT课程是达内教育品牌课程,了解详细的咨询请联系我们昆明达内IT课程的老师。