1. 程式人生 > >Spring總結之AOP

Spring總結之AOP

owin ted down 自定義 ice code -c encoding www.

一、Spring AOP簡介(百度百科)

面向切面編程(也叫面向方面編程):Aspect Oriented Programming(AOP),是軟件開發中的一個熱點,也是 Spring

框架中的一個重要內容。利用 AOP 可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度

降低,提高程序的可重用性,同時提高了開發的效率。

主要的功能是:日誌記錄,性能統計,安全控制,事務處理,異常處理等等。

二、Spring AOP實例

(1,前置通知;2,後置通知;3,環繞通知;4,返回通知;5,異常通知;)

<?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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation
=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> <!-- 業務邏輯bean --> <bean id="userService" class="top.ruandb.service.impl.UserServiceImpl" ></bean> <!-- 自定義的切面 --> <bean id="userServiceAspect" class="top.ruandb.advice.UserServiceAspect"></bean> <!-- AOP配置 --> <aop:config> <!-- 定義切面 --> <aop:aspect id="userServiceAspect" ref="userServiceAspect"> <!-- 定義切點,表達式: --> <aop:pointcut expression="execution(* top.ruandb.service.*.*(..))" id="businessService"/> <!-- 前置通知,在方法執行之前通知 --> <aop:before method="doBefore" pointcut-ref="businessService"/> <!-- 後置通知:在方法執行之後通知 --> <aop:after method="doAfter" pointcut-ref="businessService"/> <!-- 環繞通知:在方法前後環繞 --> <aop:around method="doAround" pointcut-ref="businessService"/> <!-- 返回通知:方法返回後通知 --> <aop:after-returning method="doAfterReturning" pointcut-ref="businessService"/> <!-- 異常通知:出現異常後通知 --> <aop:after-throwing method="doAfterThrowing" pointcut-ref="businessService" throwing="ex"/> </aop:aspect> </aop:config> </beans>
//切面
public class UserServiceAspect {
 
    public void doBefore(JoinPoint jp) {
        System.out.println(jp.getTarget().getClass().getName()+"前置通知:添加用戶之前");
    }
    public void doAfter(JoinPoint jp) {
        System.out.println(jp.getTarget().getClass().getName()+"後置通知:添加用戶之後");
    }
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println(pjp.getTarget().getClass().getName()+"環繞通知:環繞前");
        Object obj = pjp.proceed();
        System.out.println(pjp.getTarget().getClass().getName()+"環繞通知:環繞後");
        return obj;
    }
    public void doAfterReturning(JoinPoint jp) {
        System.out.println(jp.getTarget().getClass().getName()+"返回通知:返回通知");
    }
    public void doAfterThrowing(JoinPoint jp,Throwable ex) {
        System.out.println(jp.getTarget().getClass().getName()+"異常通知:程序異常了"+ex.getMessage());
    }  
}
 
public class SpringTest {
     ApplicationContext ac ;
     @Before
     public void setUp() {
         ac = new ClassPathXmlApplicationContext("applicationContext.xml");
     }
     @After
     public void tearDown() {
         ac = null;
     }
      
     @Test
     public void test1() {
        UserServiceI userService = (UserServiceI) ac.getBean("userService") ;
        userService.addUser("rdb");
     
     }
}
 
結果:
top.ruandb.service.impl.UserServiceImpl前置通知:添加用戶之前
top.ruandb.service.impl.UserServiceImpl環繞通知:環繞前
添加用戶rdb
top.ruandb.service.impl.UserServiceImpl返回通知:返回通知
top.ruandb.service.impl.UserServiceImpl環繞通知:環繞後
top.ruandb.service.impl.UserServiceImpl後置通知:添加用戶之後
 
結果(異常):
top.ruandb.service.impl.UserServiceImpl前置通知:添加用戶之前
top.ruandb.service.impl.UserServiceImpl環繞通知:環繞前
添加用戶rdb
top.ruandb.service.impl.UserServiceImpl異常通知:程序異常了/ by zero
top.ruandb.service.impl.UserServiceImpl後置通知:添加用戶之後

Spring總結之AOP