我所理解的aop就是,當調用一個方法時,調用前須要調用另外一個類的公共方法,調用後又須要調用另外一個方法,調用前和調用後的這兩個方法在express
其餘有些方法調用時也須要調用,因此這兩個方法就能夠做爲切面,切入那些須要調用它們的方法前和後,那些被切面切入的方法徹底不知道這個安全
切面,就像系統中的事務管理,日誌管理,安全管理等,在大部分方法被調用時都須要調用的公共方法。例如:this
這是一個沒有aop的類。這個A 類還須要管理注入的B對象,B本不應由A來負責管理的,畢竟日誌
若是還有D類也須要B類的方法,那樣豈不是D類也須要管理注入的B對象,xml
public class A{對象
private B b;事務
private C c;io
public A(C c,B b) { //注入C對象,B對象class
this.c = c;配置
this.b = b;
}
public void a() {
b.b(); //c方法執行前執行
c.c();
b.b2(); //c方法執行後執行
}
}
public class C{
public void c() {
system.out.println("我是c方法");
}
}
public class B{
public void b() {
system.out.println("我是c方法執行前執行的b方法");
}
public void b2() {
system.out.println("我是c方法執行後執行的b2方法");
}
}
這是一個修改成切面的類,這樣A類徹底不知道本身被切面B切入了,也不須要管理B對象,只須要執行本身的業務邏輯就好
public class A{
private C c;
public A(C c) { //注入C對象
this.c = c;
}
public void a() {
c.c();
}
}
public class B{
public void b() {
system.out.println("我是a方法執行前執行的b方法");
}
public void b2() {
system.out.println("我是a方法執行後執行的b2方法");
}
}
在A.xml裏配置一下
<bean id="b" class="這裏是B類的完整路徑"/> //首先須要將B類聲明爲一個Bean
<aop:config>
<aop:aspect ref="b">
<aop:pointcut id="c"
expression="execution(* *.a(..))" /> //c:被切入的那個方法。定義切面
<aop:before pointcut-ref="c"
method="b" /> //c方法執行前執行的b方法
<aop:after pointcut-ref="c"
method="b2" /> //c方法執行後執行的b2方法
</aop aspect>
</aop:config>