首页 > 代码库 > Spring——AOP
Spring——AOP
AOP(AspectOrient Programming),也就是面向切面编程。AOP将应用系统分为两部分,核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的方面Crosscuttingenterprise concerns,例如,所有大中型应用都要涉及到的持久化管理(Persistent)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等。
AOP概念:
让我们从定义一些重要的AOP概念开始。
方面(Aspect):
一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。
连接点(Joinpoint):
程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
通知(Advice):
“切面”对于某个“连接点”所产生的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。
切入点(Pointcut):
指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。
引入(Introduction):
添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。
目标对象(Target Object):
包含连接点的对象,也被称作被通知或被代理对象。
AOP代理(AOP Proxy):
AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。强制使用CGLIB代理需要将 <aop:config> 的 proxy-target-class 属性设为true
编织(Weaving):
组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。
实现原理:
AOP 实际上是由目标类的代理类实现的。AOP 代理其实是由 AOP 框架动态生成的一个对象,该对象可作为目标对象使用。AOP 代理包含了目标对象的全部方法,但 AOP 代理中的方法与目标对象的方法存在差异,AOP 方法在特定切入点添加了增强处理,并回调了目标对象的方法。
简单使用:
数据对象——UserManager:
packagecom.tgb.spring; public interfaceUserManager { public voidaddUser(String username,String password); public voiddelUser(int userId); public String findUserById(intuserId); public voidmodifyUser(int userId,String username,String password); }
UserManagerImpl:
packagecom.tgb.spring; public classUserManagerImpl implements UserManager { publicUserManagerImpl(){ } public void addUser(Stringusername, String password) { //checkSecurity(); System.out.println("--------UserManagerImpl.addUser---------"); } public voiddelUser(int userId) { //checkSecurity(); System.out.println("--------UserManagerImpl.delUser---------"); } public StringfindUserById(int userId) { //checkSecurity(); System.out.println("--------UserManagerImpl.findUserById---------"); return "王五"; } public voidmodifyUser(int userId, String username, String password) { //checkSecurity(); System.out.println("--------UserManagerImpl.modifyUser---------"); } }
SecurityHandler:
packagecom.tgb.spring; importorg.aspectj.lang.JoinPoint; public classSecurityHandler { publicSecurityHandler(){ } private voidcheckSecurity(JoinPoint join){ //如果传入参数,则可以拿到参数 for(inti=0;i<join.getArgs().length;i++){ System.out.println(join.getArgs()[i]); } //拿到方法名称 System.out.println(join.getSignature().getName()); System.out.println("-----我噢噢噢噢噢噢哦真的用了checkSecurity哦噢噢噢噢哦---------"); } }
配置文件:applicationContext.xml
客户端测试:
public void test(){ BeanFactoryfactory=new ClassPathXmlApplicationContext("applicationContext.xml"); UserManageruserManager = (UserManager)factory.getBean("userManager"); userManager.addUser("张三", "123"); }
运行结果:
本例子是通过配置xml文件来实现的,当然还可以使用注解的方式。
总结:
通过运行结果和实现原理我们得出结论:AOP是由代理类实现的。在运行期将切面织入到Spring管理的Bean中,代理类封装了目标类,拦截被通知的方法的调用,再将调用转发给真正的目标Bean。当拦截到方法调用时,在调用目标类之前代理会执行切面逻辑。一句话:IOC是工厂;AOP是代理。
Spring——AOP