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()); //得到方法签名
}
-- 学海无涯