多pointcut的 expression语法应该用 and或者or联接,比如需要匹配两个方法
<aop:pointcut id="mycut" expression="execution(* cn.itcast.service.impl.PersonServiceBean.save*(..)) or execution(* cn.itcast.service.impl.PersonServiceBean.update*(..))" />
这样就指定sava和update开头的方法使用aop
------------------------------------------------正文开始-------------------------------------
<?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"> <bean id="personServiceBean" class="cn.itcast.service.impl.PersonServiceBean"></bean> <bean id="aspetbean" class="cn.itcast.service.impl.MyInterceptor"></bean> <aop:config> <aop:aspect id="asp" ref="aspetbean"> <aop:pointcut id="mycut" expression="execution(* cn.itcast.service.impl.PersonServiceBean.save*(..)) or execution(* cn.itcast.service.impl.PersonServiceBean.update*(..))" /> <aop:before pointcut-ref="mycut" method="doBefore"/> <aop:after pointcut-ref="mycut" method="doAfter"/> <aop:after-returning pointcut-ref="mycut" method="doAfterReturning"/> <aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"/> <aop:around pointcut-ref="mycut" method="deAround"/> </aop:aspect> </aop:config> </beans>
package cn.itcast.service; public interface IPersonService { void save(); void update(String name, Integer id); String getPersonName(Integer id); }
package cn.itcast.service.impl; import cn.itcast.service.IPersonService; public class PersonServiceBean implements IPersonService { public void save(){ System.out.println("我是Save方法()"); throw new RuntimeException("ssss"); } public void update(String name,Integer id){ System.out.println("我是update方法()"+id+name); } public String getPersonName(Integer id){ System.out.println("我是getPersonName方法()"+id); return "lisi"; } }
package cn.itcast.service.impl; import org.aspectj.lang.ProceedingJoinPoint; public class MyInterceptor { public void doBefore(){ System.out.println("前置通知"); } public void doAfterReturning() { System.out.println("后置通知"); } public void doAfter() { System.out.println("最终通知"); } public void doAfterThrowing(){ System.out.println("抛出意外"); } public Object deAround(ProceedingJoinPoint pjp)throws Throwable{ Object result; System.out.println("进入方法"); // if(true){ result=pjp.proceed(); // } System.out.println("退出方法"); return result; } }
package junit.test; import cn.itcast.service.*; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringAOPTest { @BeforeClass public static void setUpBeforeClass() throws Exception { } @Test public void interceptorTest(){ ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml"); IPersonService personService=(IPersonService)ctx.getBean("personServiceBean"); personService.update("sfd",12); } }