参考链接:https://www.yiibai.com/spring/spring-aop-example-pointcut-advisor.html
- Advice – 指示之前或方法执行后采取的行动。
- Pointcut– 指明哪些方法应该拦截,通过方法的名称或正则表达式模式。
- Advisor – 分组"通知"和”切入点“成为一个单元,并把它传递到代理工厂对象
拦截constomService中print方法
constomService:
package com.crud.spring.service; public class CustomerService { private String name; private String url; public void setName(String name) { this.name = name; } public void setUrl(String url) { this.url = url; } public void printName() { System.out.println("Customer name : " + this.name); } public void printURL() { System.out.println("Customer website : " + this.url); } public void printThrowException() { throw new IllegalArgumentException(); } }
hijackAroundMethodBeanAdvice:
package com.crud.spring.aop; import java.util.Arrays; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class HijackAroundMethod implements MethodInterceptor { @Override public Object invoke(MethodInvocation methodInvocation) throws Throwable { System.out.println("Method name : " + methodInvocation.getMethod().getName()); System.out.println("Method arguments : " + Arrays.toString(methodInvocation.getArguments())); System.out.println("HijackAroundMethod : Before method hijacked!"); try { Object result = methodInvocation.proceed(); System.out.println("HijackAroundMethod : Before after hijacked!"); return result; } catch (IllegalArgumentException e) { System.out.println("HijackAroundMethod : Throw exception hijacked!"); throw e; } } }
xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="customerService" class="com.crud.spring.service.CustomerService"> <property name="name" value=" YiiBaii Mook Kim"></property> <property name="url" value=" http://www.yiibai.com"></property> </bean> <bean id="hijackAroundMethodBeanAdvice" class="com.crud.spring.aop.HijackAroundMethod" /> <bean id="customerServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="customerService" /> <property name="interceptorNames"> <list> <value>customerAdvisor</value> </list> </property> </bean> <bean id="customerCut" class="org.springframework.aop.support.NameMatchMethodPointcut"> <property name="mappedName" value="printName" /> </bean> <bean id="customerAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor"> <property name="pointcut" ref="customerCut" /> <property name="advice" ref="hijackAroundMethodBeanAdvice" /> </bean> </beans>
测试:
package com.crud.spring.test; import com.crud.spring.service.CustomerService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); CustomerService cust = (CustomerService) applicationContext.getBean("customerServiceProxy"); System.out.println("*************************"); cust.printName(); System.out.println("*************************"); cust.printURL(); System.out.println("*************************"); try { cust.printThrowException(); } catch (Exception e) { } } }