AOP:面向切面編程
代理模式講解AOP技術
操作接口
代理實現 à真實實現
因為此代理類只能為一個接口的對象進行代理 à靜態代理
能不能有一種方法可以為所有的類進行代理 à動態代理
Spring提供的一系列Advices接口
|-
BeforeAdvice
|-
AfterAdvice
主要操作是在配置上:applicationContext.xml
文件上
了解其作用:只關注于業務本身,而與其他業務無關
à尚學堂代碼實例(spring-avi-152-014):
public class
SecurityHandler implements InvacationHandler {
private Object targetObject;
public Object newProxy(Object
targetObject) {
this.targetObject = targetObject;
return
Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass.getInterfaces(),
this);
}
Public Object
invoke(Object proxy,Method method,Object[] args)throws Throwable {
checkSecuity();
Object ret = null;
Try {
ret = method.invoke(this.targetObject , args);
}catch(Exception
e) {
e.printStackTrace();
throw new java.lang.RuntimeException(e);
}
return ret;
}
private void checkSecurtiy() {
System.out.println(“------------checkSecurity()-----------”);
}
}
àSpring對 AOP的支持(采用Annotation的方式)
1、spring依賴庫
* SPRING_HOME/dist/spring.jar
* SPRING_HOME/lib/Jakarta-commons/commons-logging.jar
* SPRING_HOME/lib/log4j-1.2.14.jar
*SPRING_HOME/lib/aspectj/*.jar
2、
采用Aspect定義切面
1、 在Aspect定義Pointcut和Advice
2、 啟用AspectJ對Annotation的支持并且將Aspect類和目標對象配置到LOC容器中
注意:在這種方法定義中,切入點的方法是不是被執行的,它存在的目的僅僅是為了重用切入點即Advice中通過方法名引用這個切入點
AOP:
l
Cross cutting concern
l
Aspect
l
Advice(橫切關注點的具體實現)
l
Pointcut(圈定了一個范圍 )
l
Joinpoint spring只支持方法級的Joinpoint
l
Weave
l
Target Object
l
Proxy
l
Introduction
à實例(spring-avi-152-016):
/**
*定義Pointcut,Pointcut的名稱就是allAddMethod,此方法不能有返回值和參數,只是一個標
*識
*
*Pointcut的內容是一個表達式,描述哪些對象的哪些方法(訂閱Joinpoint)
*/
@Aspect
Public class SecurityHandle {
@Pointcut(“execution(* add*(..)) || execution(*del*(..))”) //第一個*表示返回值,第二個表示以add開頭的所//有方法, ..表示所有參數
Private void
allAddMethod() {}; //不會被調用,只是一個標識
/**
*定義Advice,標識在哪個切入點何處織入此方法
*
*/
@Before(“allAddMethod()”)
Private void
checkSecurity() {
System.out.println(“---------------------------checkSecurity()----------------------------”);
}
}
需要在applicationContext中加入:<aop:aspectj-autoproxy/> 啟用對Annotation的支持
spring-avi-152-017
à靜態文件配置方式
<aop:config>
<aop:aspect id=”” ref=””>
<aop:pointcut id=”allAddMethod”
expression=”execution(* com.bjsxt.spring.UserManager.add*(..))”/>
<aop:before method=”” pointcut-ref=””/>
</aop:apect>
</aop:config>
àspring的JoinPoint只針對方法
public class
SecurityHandler {
private void args = joinPoint.getArgs();
Object[]
args = joinPoint.getArgs(); //取得方法的參數
For (int i=0;i<args.length;i++) {
System.out.println(args[i]);
}
System.out.println(joinPoint.getSignature().getName()); //得到方法簽名
}
--
學海無涯