创建Bean
@H_502_3@//首先创建业务接口 package com.codestd.springstudy.aop.xml.service; public interface UserService { public void login(); public void logout() throws Exception; } //创建实现类 package com.codestd.springstudy.aop.xml.service; public class UserServiceImpl implements UserService { @Override public void login() { System.out.println("User login"); } @Override public void logout() throws Exception { System.out.println("User logout"); throw new Exception("Exception test"); } } //创建切面类 package com.codestd.springstudy.aop.xml; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; public class AspectBean { public void doAfter(JoinPoint jp){ System.out.println("do after"); } public void doBefore(JoinPoint jp){ System.out.println("do after"); } public Object doAround(ProceedingJoinPoint jp) throws Throwable{ System.out.println("do Around"); Object obj = jp.proceed(); return obj; } public void doThrowing(JoinPoint jp,Exception e){ System.out.println(e.getClass().getName()+"|->|"+e.getMessage()); } }配置AOP
下面使用XML配置AOP
@H_502_3@<bean id="userService" class="com.codestd.springstudy.aop.xml.service.UserServiceImpl" /> <bean id="aspectBean" class="com.codestd.springstudy.aop.xml.AspectBean" /> <aop:config> <aop:aspect id="aspect" ref="aspectBean"> <aop:pointcut expression="execution(* com.codestd.springstudy.aop.xml.service.*.*(..))" id="servicePointcut"/> <aop:after method="doAfter" pointcut-ref="servicePointcut" /> <aop:before method="doBefore" pointcut-ref="servicePointcut"/> <aop:around method="doAround" pointcut-ref="servicePointcut"/> <aop:after-throwing method="doThrowing" pointcut-ref="servicePointcut" throwing="e"/> </aop:aspect> </aop:config>
doAround
方法要有返回值,并且类型是Object,接收的参数类型为ProceedingJoinPoint
。
aop:after-throwing
中需要使用throwing
指定异常的参数名,doThrowing(JoinPoint jp,Exception e)
中的e
。
测试
测试方法如下
@H_502_3@package com.codestd.springstudy.aop.xml.service; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:aop/applicationContext.xml"}) public class UserServiceImplTest { @Autowired private UserService userService; @Test public void test() throws Exception { this.userService.login(); this.userService.logout(); } }测试结果如下
@H_502_3@do after do Around User login do after do after do Around User logout do after java.lang.Exception|->|Exception test使用XML方式配置引入
@H_502_3@<aop:config> <aop:aspect> <aop:declare-parents types-matching="com.codestd.springstudy.aop.xml.service.UserService+" implement-interface="com.codestd.springstudy.aop.introductions.Flyable" default-impl="com.codestd.springstudy.aop.introductions.DefaultFlyable"/> </aop:aspect> </aop:config>测试类如下
@H_502_3@@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:aop/applicationContext.xml"}) public class UserServiceImplTest { @Autowired private Flyable flyable; @Test public void test() throws Exception { this.flyable.fly(); } }