1. 动态代理
动态代理类需要实现InvocationHandler接口并重写其中的invoke()方法
实例如下:
实例其功能是在调用执行目标对象的方法之前调用执行checkSecurity方法
publicclass SecurityHandler
implements InvocationHandler {
private Object
targetObject;
public Object newProxy(Object
targetObject) {
this.targetObject =
targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
checkSecurity();
Object returnValue = null;
try {
returnValue = method.invoke(this.targetObject, args);
} catch (Exception e) {
e.printStackTrace();
thrownew RuntimeException(e);
}
return returnValue;
}
privatevoidcheckSecurity() {
System.out.println("SecurityHandler.checkSecurity()");
}
}
|
SecurityHandler handler = new SecurityHandler();
IUserManager userManager = (IUserManager)handler.newProxy(new UserManagerImpl());
userManager.addUser("zhaoTeacher",
"123");
|
2.
Spring中Annotation方式进行AOP
需要在代理类中以注解的方式进行标记
实例如下:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
//定义Aspect
@Aspect
publicclass SecurityHandler {
/**
*定义Pointcut,Pointcut的名称就是allAddMethod,
*此方法不能有返回值和参数,
*该方法只是一个标识
*/
@Pointcut("execution(* add*(..)) || execution(* del*(..))")
privatevoid
allAddMethod() {}
/**
*下面注解意思是在所有add方法之前执行checkSecurity()。
*/
@Before("allAddMethod()")
privatevoid
checkSecurity() {
System.out.println("SecurityHandler.checkSecurity()");
}
}
|
配置方法如下:
<aop:aspectj-autoproxy/><!--
启用Annotation方式切入 -->
<bean
id="userManager"
class="com.xasxt.spring.UserManagerImpl"/>
<bean
id="security"
class="com.xasxt.spring.SecurityHandler"/>
|
3. 配置方式切入(@AspectJ支持)
配置实例如下:
具体实现效果同上面的注解方式以及动态代理方式。
<bean
id="userManager"
class="com.xasxt.spring.UserManagerImpl"/>
<bean
id="securityHandler"
class="com.xasxt.spring.SecurityHandler"/>
<aop:config>
<aop:aspect
id="security"
ref="securityHandler">
<aop:pointcut
id="allAddMethod"
expression="execution(* com.xasxt.spring.UserManagerImpl.add*(..))"/>
<aop:before
method="checkSecurity"
pointcut-ref="allAddMethod"/>
</aop:aspect>
</aop:config>
|
4.
Spring对AOP的支持
I、
Spring中Advice如何接收方法的参数:
l Aspect默认情况下不用实现接口,但对于目标对象(UserManagerImpl.java),在默认情况下必须实现接口;如果没有实现接口必须引入CGLIB库
l 我们可以通过在Advice中添加一个JoinPoint参数,这个值会由spring自动传入,从JoinPoint中可以取得参数值、方法名等等。
II、 如何选择代理:
l 如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
l 如果目标对象实现了接口,也可以强制使用CGLIB实现AOP
l 如果目标对象没有实现接口,则必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
|
III、 如何强制使用CGLIB实现AOP:
Ø 添加CGLIB库,SPRING_HOME/cglib/*.jar
Ø 在spring配置文件中加入下面配置:
<aop:aspectj-autoproxy proxy-target-class="true"/>
IV、
JDK动态代理和CGLIB字节码生成的区别
l
JDK动态代理只能对实现了接口的类生成代理,而不能针对未实现接口的类
l
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法;因为是继承,所以该类或方法最好不要声明成final
|
分享到:
相关推荐
Spring,面向切面编程AOP例子!AOP(Aspect Oriented Programming)!
AOP(Aspect Oriented Programming):面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP是对OOP的补充,是软件开发中的一个热点,也是Spring框架中的一个重要内容。 利用AOP...
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,...
AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。下面这篇文章主要给大家介绍了关于利用C#实现AOP常见的几种方法,需要的朋友可以参考借鉴,...
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是...
AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面编程。 OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决问题的方法中的共同点,是对OO思想的一种补充! 主要的功能是:...
AOP 的全称是“Aspect Oriented Programming”,即面向切面编程,它将业务逻辑的各个部分进行隔离,使开发人员在编写业务逻辑时可以专心于核心业务,从而提高了开发效率。AOP 采取横向抽取机制,取代了传统纵向继承...
AOP即面向切面编程(Aspect Oriented Programming的缩写),是OOP(面向对象编程)的一种延续形式。是通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术,它从一个不同于OOP的...
面向切面编程(AOP),全称 Aspect Oriented Programming。是基于面向对象编程之上的编程思想。指的是在程序运行期间,将某段代码动态的切入到指定方法的指定位置进行运行的编程方式。 动态代理可以非耦合动态...
面向过程编程(思想)POP(Procedure Oriented Programming) 面向对象编程(思想)OOP (Object Oriented...面向切面编程(思想)AOP (Aspect Oriented Programming) 面向接口编程(思想)IOP (Interface Oriented Programming)
面向切面编程(Aspect-Oriented Programming,AOP): - AOP允许将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,例如日志记录、性能监控、事务管理等。 - Spring框架通过AOP支持将切面逻辑与业务...
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是...
面向切面编程(Aspect-Oriented Programming,AOP):Spring支持面向切面编程,允许开发者将横切关注点(如日志、事务、安全性等)从核心业务逻辑中分离出来,并以模块化的方式进行重用。这样可以提高代码的可维护性...
AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。Spring框架用的核心技术就是AOP,是函数式编程的一种衍生范型。利用AOP的好处就是可以对业务...
AOP(Aspect Oriented Programming)面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构以完善面向对象编程(OOP),AOP为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织入到面向对象的...
面向切面编程(Aspect-oriented programming,AOP)是一种编程范式。做后端 Java web 的同学,特别是用过 Spring 的同学肯定对它非常熟悉。AOP 是 Spring 框架里面其中一个重要概念。可是在 Javascript 中,AOP 是一...
AOP,百度一下就知道,是 Aspect Oriented Programming,面向切面编程。怎么理解面向切面编程呢? 我用一个场景来解释一下: 我们在一个项目中会有很多模块或者函数(在图中统称为任务,下同)要使用,而在进行某些...
Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。 提供了展现层 SpringMVC和持久层 Spring ...
aop(aspect oriented programming)面向切面编程是spring当中一个重要内容,在学习之后感觉这个思想挺不错的,做个总结 AOP讲解 一、面向切面编程 听说过面向对象编程(oop),但是面向切面编程还真是第一次...
那么面向切面编程AOP(Aspect-OrientedProgramming)则可以对系统需求进行很好的模软件开发经历了从汇编语言到高级语言和从过程化编程到面向对象编程;前者是为了提高开发效率,而后者则使用了归纳法,把具有共性的...