参考链接: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) {

}

}
}