Spring Aop实例

一、XML方式

1. TestAspect:切面类

[java] view plaincopyprint?

1. packagecom.spring.aop;

2.  

3. importorg.aspectj.lang.JoinPoint;

4. importorg.aspectj.lang.ProceedingJoinPoint;

5.  

6. publicclass TestAspect {

7.  

8. publicvoid doAfter(JoinPoint jp) {

9. System.out.println("logEnding method: " + jp.getTarget().getClass().getName() + "." +jp.getSignature().getName());

10.}

11. 

12.publicObject doAround(ProceedingJoinPoint pjp) throws Throwable {

13.long time= System.currentTimeMillis();

14.ObjectretVal = pjp.proceed();

15.time =System.currentTimeMillis() - time;

16.System.out.println("processtime: " + time + " ms");

17.returnretVal;

18.}

19. 

20.publicvoid doBefore(JoinPoint jp) {

21.System.out.println("logBegining method: " + jp.getTarget().getClass().getName() + "." +jp.getSignature().getName());

22.}

23. 

24.publicvoid doThrowing(JoinPoint jp, Throwable ex) {

25.System.out.println("method" + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName()+ " throw exception");

26.System.out.println(ex.getMessage());

27.}

28.}

packagecom.spring.aop;

 

importorg.aspectj.lang.JoinPoint;

importorg.aspectj.lang.ProceedingJoinPoint;

 

publicclass TestAspect {

 

public void doAfter(JoinPoint jp) {

  System.out.println("log Ending method:" + jp.getTarget().getClass().getName() + "." +jp.getSignature().getName());

}

 

public Object doAround(ProceedingJoinPoint pjp)throws Throwable {

  long time = System.currentTimeMillis();

  Object retVal = pjp.proceed();

  time = System.currentTimeMillis() - time;

  System.out.println("process time: "+ time + " ms");

  return retVal;

}

 

public void doBefore(JoinPoint jp) {

  System.out.println("log Begining method:" + jp.getTarget().getClass().getName() + "." +jp.getSignature().getName());

}

 

public void doThrowing(JoinPoint jp, Throwableex) {

  System.out.println("method " +jp.getTarget().getClass().getName() + "." +jp.getSignature().getName() + " throw exception");

  System.out.println(ex.getMessage());

}

}

2. AServiceImpl:目标对象

[java] view plaincopyprint?

1. packagecom.spring.service;

2.  

3. // 使用jdk动态代理

4. publicclass AServiceImpl implements AService {

5.  

6. publicvoid barA() {

7. System.out.println("AServiceImpl.barA()");

8. }

9.  

10.publicvoid fooA(String _msg) {

11.System.out.println("AServiceImpl.fooA(msg:"+ _msg + ")");

12.}

13.}

packagecom.spring.service;

 

// 使用jdk动态代理

publicclass AServiceImpl implements AService {

 

public void barA() {

  System.out.println("AServiceImpl.barA()");

}

 

public void fooA(String _msg) {

  System.out.println("AServiceImpl.fooA(msg:"+ _msg + ")");

}

}

3. BServiceImpl:目标对象

[java] view plaincopyprint?

1. packagecom.spring.service;

2.  

3. // 使用cglib

4. publicclass BServiceImpl {

5.  

6. publicvoid barB(String _msg, int _type) {

7. System.out.println("BServiceImpl.barB(msg:"+ _msg + " type:" + _type + ")");

8. if (_type== 1)

9. throw newIllegalArgumentException("测试异常");

10.}

11. 

12.publicvoid fooB() {

13.System.out.println("BServiceImpl.fooB()");

14.}

15. 

16.}

packagecom.spring.service;

 

// 使用cglib

publicclass BServiceImpl {

 

public void barB(String _msg, int _type) {

  System.out.println("BServiceImpl.barB(msg:"+ _msg + " type:" + _type + ")");

  if (_type == 1)

   throw new IllegalArgumentException("测试异常");

}

 

public void fooB() {

  System.out.println("BServiceImpl.fooB()");

}

 

}

4. ApplicationContext:Spring配置文件

[html] view plaincopyprint?

1. <?xml version="1.0"encoding="UTF-8"?>

2. <beans xmlns="http://www.springframework.org/schema/beans"

3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

4. xmlns:aop="http://www.springframework.org/schema/aop"

5. xmlns:context="http://www.springframework.org/schema/context"

6. xmlns:tx="http://www.springframework.org/schema/tx"

7. xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd

8. http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.1.xsd

9. http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd

10.http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

11.<aop:config>

12.<aop:aspect id="TestAspect"ref="aspectBean">

13.<!--配置com.spring.service包下所有类或接口的所有方法-->

14.<aop:pointcut id="businessService"expression="execution(*com.spring.service.*.*(..))" />

15.<aop:before pointcut-ref="businessService"method="doBefore"/>

16.<aop:after pointcut-ref="businessService"method="doAfter"/>

17.<aop:around pointcut-ref="businessService"method="doAround"/>

18.<aop:after-throwing pointcut-ref="businessService"method="doThrowing"throwing="ex"/>

19.</aop:aspect>

20.</aop:config>

21. 

22.<bean id="aspectBean"class="com.spring.aop.TestAspect"/>

23.<bean id="aService"class="com.spring.service.AServiceImpl"></bean>

24.<bean id="bService"class="com.spring.service.BServiceImpl"></bean>

25.</beans>

<?xmlversion="1.0" encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xmlns:aop="http://www.springframework.org/schema/aop"

  xmlns:context="http://www.springframework.org/schema/context"

  xmlns:tx="http://www.springframework.org/schema/tx"

  xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd

    http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.1.xsd

    http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd

    http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

    <aop:config>

        <aop:aspectid="TestAspect" ref="aspectBean">

            <!--配置com.spring.service包下所有类或接口的所有方法-->

            <aop:pointcutid="businessService" expression="execution(*com.spring.service.*.*(..))" />

            <aop:beforepointcut-ref="businessService" method="doBefore"/>

            <aop:afterpointcut-ref="businessService" method="doAfter"/>

            <aop:aroundpointcut-ref="businessService" method="doAround"/>

            <aop:after-throwingpointcut-ref="businessService" method="doThrowing" throwing="ex"/>

        </aop:aspect>

    </aop:config>

   

    <bean id="aspectBean"class="com.spring.aop.TestAspect" />

    <bean id="aService"class="com.spring.service.AServiceImpl"></bean>

    <bean id="bService"class="com.spring.service.BServiceImpl"></bean>

</beans>

二、注解(Annotation)方式

1. TestAnnotationAspect

[java] view plaincopyprint?

1. packagecom.spring.aop;

2.  

3. importorg.aspectj.lang.ProceedingJoinPoint;

4. import org.aspectj.lang.annotation.After;

5. importorg.aspectj.lang.annotation.AfterReturning;

6. importorg.aspectj.lang.annotation.AfterThrowing;

7. importorg.aspectj.lang.annotation.Around;

8. importorg.aspectj.lang.annotation.Aspect;

9. importorg.aspectj.lang.annotation.Before;

10.importorg.aspectj.lang.annotation.Pointcut;

11. 

12.@Aspect

13.publicclass TestAnnotationAspect {

14. 

15.@Pointcut("execution(*com.spring.service.*.*(..))")

16.privatevoid pointCutMethod() {

17.}

18. 

19.//声明前置通知

20.@Before("pointCutMethod()")

21.publicvoid doBefore() {

22.System.out.println("前置通知");

23.}

24. 

25.//声明后置通知

26.@AfterReturning(pointcut ="pointCutMethod()", returning = "result")

27.publicvoid doAfterReturning(String result) {

28.System.out.println("后置通知");

29.System.out.println("---"+ result + "---");

30.}

31. 

32.//声明例外通知

33.@AfterThrowing(pointcut ="pointCutMethod()", throwing = "e")

34.publicvoid doAfterThrowing(Exception e) {

35.System.out.println("例外通知");

36.System.out.println(e.getMessage());

37.}

38. 

39.//声明最终通知

40.@After("pointCutMethod()")

41.publicvoid doAfter() {

42.System.out.println("最终通知");

43.}

44. 

45.//声明环绕通知

46.@Around("pointCutMethod()")

47.publicObject doAround(ProceedingJoinPoint pjp) throws Throwable {

48.System.out.println("进入方法---环绕通知");

49.Object o= pjp.proceed();

50.System.out.println("退出方法---环绕通知");

51.return o;

52.}

53.}

packagecom.spring.aop;

 

importorg.aspectj.lang.ProceedingJoinPoint;

importorg.aspectj.lang.annotation.After;

importorg.aspectj.lang.annotation.AfterReturning;

importorg.aspectj.lang.annotation.AfterThrowing;

importorg.aspectj.lang.annotation.Around;

importorg.aspectj.lang.annotation.Aspect;

importorg.aspectj.lang.annotation.Before;

importorg.aspectj.lang.annotation.Pointcut;

 

@Aspect

publicclass TestAnnotationAspect {

 

@Pointcut("execution(*com.spring.service.*.*(..))")

private void pointCutMethod() {

}

 

//声明前置通知

@Before("pointCutMethod()")

public void doBefore() {

  System.out.println("前置通知");

}

 

//声明后置通知

@AfterReturning(pointcut ="pointCutMethod()", returning = "result")

public void doAfterReturning(String result) {

  System.out.println("后置通知");

  System.out.println("---" + result +"---");

}

 

//声明例外通知

@AfterThrowing(pointcut ="pointCutMethod()", throwing = "e")

public void doAfterThrowing(Exception e) {

  System.out.println("例外通知");

  System.out.println(e.getMessage());

}

 

//声明最终通知

@After("pointCutMethod()")

public void doAfter() {

  System.out.println("最终通知");

}

 

//声明环绕通知

@Around("pointCutMethod()")

public Object doAround(ProceedingJoinPoint pjp)throws Throwable {

  System.out.println("进入方法---环绕通知");

  Object o = pjp.proceed();

  System.out.println("退出方法---环绕通知");

  return o;

}

}

2. ApplicationContext:Spring配置文件

[java] view plaincopyprint?

1. <?xmlversion="1.0" encoding="UTF-8"?>

2. <beansxmlns="http://www.springframework.org/schema/beans"

3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

4. xmlns:aop="http://www.springframework.org/schema/aop"

5. xmlns:context="http://www.springframework.org/schema/context"

6. xmlns:tx="http://www.springframework.org/schema/tx"

7. xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd

8. http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.1.xsd

9. http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd

10.http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

11.<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

12.<beanclass="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>

13. 

14.<beanid="aspectBean" class="com.spring.aop.TestAnnotationAspect"/>

15.<beanid="aService"class="com.spring.service.AServiceImpl"></bean>

16.<beanid="bService"class="com.spring.service.BServiceImpl"></bean>

17.</beans>

<?xmlversion="1.0" encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xmlns:aop="http://www.springframework.org/schema/aop"

  xmlns:context="http://www.springframework.org/schema/context"

  xmlns:tx="http://www.springframework.org/schema/tx"

  xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd

    http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.1.xsd

    http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd

    http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

    <beanclass="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>

 

    <bean id="aspectBean"class="com.spring.aop.TestAnnotationAspect" />

    <bean id="aService"class="com.spring.service.AServiceImpl"></bean>

    <bean id="bService"class="com.spring.service.BServiceImpl"></bean>

</beans>

关于切入点表达式,大家需要好好练习才能深入理解其中含义。即使看的懂,但是写起来却非常麻烦,并没有想象中那么简单。

最后,再告诉大家:

任何通知(Advice)方法可以将第一个参数定义为 org.aspectj.lang.JoinPoint类型。JoinPoint接口提供了一系列有用的方法, 比如 getArgs() (返回方法参数)、getThis() (返回代理对象)、getTarget() (返回目标)、getSignature() (返回正在被通知的方法相关信息)和 toString() (打印出正在被通知的方法的有用信息。

其中getSignature()返回的Signature对象可强制转换为MethodSignature,其功能非常强大,能获取包括参数名称在内的一切方法信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值