1.代理工厂Bean
前置增强 实现MethodBeforeAdvice 在方法执行之前执行
后置增强 实现AfterReturingAdvice 在方法执行之后执行
环绕增强 实现MethodInterceptor 在方法前后都执行增强
异常增强 实现ThrowsAdvice 接口中没有方法,但是得实现afterThrows
public void afterThrows( [Method method,] [Object args,] [Object target,] Throwable throwable );
<!--1.目标对象--> <bean id="service" class="cn.happy.day11aop01.SomeServiceImpl"></bean> <!--2.增强--> <bean id="beforeAdvice" class="cn.happy.day11aop01.MyBeforeAdvice"></bean> <!--3.代理工厂bean实现代理对象的生成--> <bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <!--target:目标对象是谁--> <property name="target" ref="service"></property> <property name="interceptorNames" value="beforeAdvice" ></property> </bean> </beans>
环绕增强:
public interface SomeBefore { public void sayhi(); }
public class SomeBeforeImpl implements SomeBefore { public void sayhi() { System.out.println("我是李白"); } }
public class BeforeTest implements MethodInterceptor { public Object invoke(MethodInvocation methodInvocation) throws Throwable { System.out.println("我在上"); methodInvocation.proceed(); System.out.println("我在下"); return null; } }
<!--目标类型--> <bean id="service" class="Inectoper.SomeBeforeImpl"></bean> <!--增强通知--> <bean id="beforeadvice" class="Inectoper.BeforeTest"></bean> <!--代理工厂bean 自己也是bean 中和调度目标类型和增强--> <bean id="proxys" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="service"></property> <property name="interceptorNames" value="beforeadvice"></property> </bean>
@Test public void Test03(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext08.xml"); Inectoper.SomeBefore bean =(Inectoper.SomeBefore) context.getBean("proxys"); bean.sayhi(); }
运行结果:
advice 通知
advisor 顾问
2.顾问(Advisor)
通知Advice是Spring提供的一种切面(Aspect)。但其功能过于简单,只能
将切面织入到目标类的所有目标方法中,无法完成将切面织入到指定目标方法中。
顾问Advisor是Spring提供的另一种切面。其可以完成更为复杂的切面织入功能,能选择性的将增强切面中的部分方法。
PointcutAdvisor是顾问的一种,可以指定具体的切入点。顾问将通知进行了包装,会根据不同的通知类型,在不同的时间点,
将切面织入到不同的切入点。
PointcutAdvisor接口有两个较为常用的实现类: *:NameMatchMethodPointcutAdvisor 名称匹配方法切入点顾问 *: RegexpMethodPointcutAdvisor 正则表达式方法切入点顾问 <property name="pattern" value=".*do.*"></property> 表示方法全名(包名,接口名,方法名) 运算符 名称 意义 . 点号 表示任意单个字符 + 加号 表示前一个字符出现一次或者多次 * 星号 表示前一个字符出现0次或者多次 名称匹配方法切入点顾问 NameMatchMethodPointcutAdvisor <!-- 03.配置顾问 advisor 包装 advice--> <bean id="beforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <property name="advice" ref="beforeAdvice"></property> <property name="mappedNames" value="do*"></property> </bean>