天天看點

AOP面向切面程式設計

aop概念

aop:

   1、切面

        事務、日志、安全性架構、權限等都是切面

   2、通知

      切面中的方法就是通知

   3、目标類

   4、切入點

         隻有符合切入點,才能讓通知和目标方法結合在一起

   5、織入:

         形成代理對象的方法的過程

好處:

   事務、日志、安全性架構、權限、目标方法之間完全是松耦合的

Spring AOP例子

一個方法的完整表示

     修飾   傳回值類名  方法名(參數類型) 抛出的異常類型

切入點表達式

execution(public * *(..))  所有的公共方法

execution(* set*(..))  以set開頭的任意方法

execution(* com.xyz.service.AccountService.*(..)) com.xyz.service.AccountService類中的所有的方法

execution(* com.xyz.service.*.*(..))  com.xyz.service包中的所有的類的所有的方法

execution(* com.xyz.service..*.*(..)) com.xyz.service包及子包中所有的類的所有的方法

execution(* cn.itcast.spring.sh..*.*(String,?,Integer))  cn.itcast.spring.sh包及子包中所有的類的有三個參數

                                                            第一個參數為String,第二個參數為任意類型,

                                                            第三個參數為Integer類型的方法

例子:

spring配置檔案applicationContext.xml

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

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

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

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

xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

    <!-- 導入目标類,導入切面-->

    <bean id="personDao" class="springAOP.cn.itcast.aop.PersonDaoImpl"></bean>

    <bean id="myTransaction" class="springAOP.cn.itcast.aop.MyTransaction"></bean>

    <!-- aop配置 -->

    <aop:config>

    <!-- 切入點表達式=目标方法 -->

    <aop:pointcut expression="execution(* springAOP.cn.itcast.aop.PersonDaoImpl.*(..) )" id="perform"/>

    <!-- 切面 -->

    <aop:aspect ref="myTransaction">

    <aop:before method="beginTran" pointcut-ref="perform"/>

    <aop:after-returning method="commit" pointcut-ref="perform" />

    </aop:aspect>

    </aop:config>

 </beans>

測試

public void test1(){

ApplicationContext context = new ClassPathXmlApplicationContext("/springAOP/cn/itcast/aop/applicationContext.xml");

PersonDao personDao = (PersonDao) context.getBean("personDao");

Person person = new Person();

person.setPname("wang");

person.setPsex("male");

System.out.println(personDao);

personDao.savePerson(person);}}

AOP代理原理

springAOP的具體加載步驟:

   1、當spring容器啟動的時候,加載了spring的配置檔案

   2、為配置檔案中所有的bean建立對象

   3、spring容器會解析aop:config的配置

       1、解析切入點表達式,用切入點表達式和納入spring容器中的bean做比對

            如果比對成功,則會為該bean建立代理對象,代理對象的方法=目标方法+通知

            如果比對不成功,不會建立代理對象

   4、在用戶端利用context.getBean擷取對象時,如果該對象有代理對象則傳回代理對象,如果代理對象,則傳回目标對象

說明:如果目标類沒有實作接口,則spring容器會采用cglib的方式産生代理對象,如果實作了接口,會采用jdk的方式

<s:debug></s:debug>是深度變量的,周遊一個bean的屬性,周遊集合屬性的值