Spring 基于引语方式声明切面
Spring 基于注解方式声明切面
package cn.itcast.service; public interface PersonService { public void save(String name); public void update(String name, Integer id); public String getPersonName(Integer id); }
package cn.itcast.service.impl; import cn.itcast.service.PersonService; public class PersonServiceBean implements PersonService { public String getPersonName(Integer id) { System.out.println("我是getPersonName()方法"); return "xxx"; } public void save(String name) { // throw new RuntimeException("我爱例外"); System.out.println("我是save()方法"); } public void update(String name, Integer id) { System.out.println("我是update()方法"); } }
package cn.itcast.service; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; /** * 切面 * */ @Aspect public class MyInterceptor { // 拦截cn.itcast.service.impl.PersonServiceBean下返回值为任意类型的所有方法,参数可有可无,个数不限定 @Pointcut("execution (* cn.itcast.service.impl.PersonServiceBean.*(..))") private void anyMethod() { }// 声明一个切入点,用一个方法表示 @Before("anyMethod() && args(name)") public void doAccessCheck(String name) { System.out.println("前置通知:" + name); } // 返回值类型为字符串 @AfterReturning(pointcut = "anyMethod()", returning = "result") public void doAfterReturning(String result) { System.out.println("后置通知:" + result); } @After("anyMethod()") public void doAfter() { System.out.println("最终通知"); } @AfterThrowing(pointcut = "anyMethod()", throwing = "e") public void doAfterThrowing(Exception e) { System.out.println("例外通知:" + e); } // 环绕通知 @Around("anyMethod()") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { // if(){//判断用户是否在权限 System.out.println("进入方法"); Object result = pjp.proceed(); System.out.println("退出方法"); // } return result; } }
package junit.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.itcast.service.PersonService; public class SpringAOPTest { @Test public void interceptorTest() { ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml"); PersonService personService = (PersonService) cxt .getBean("personService"); personService.save("xxx"); } }
<?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" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <!-- 启动对@AspectJ注解的支持 --> <aop:aspectj-autoproxy/> <bean id="myInterceptor" class="cn.itcast.service.MyInterceptor"/> <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"></bean> </beans>