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的屬性,周遊集合屬性的值