Spring AOP目前仅支持方法执行链接点(建议在Spring bean上执行方法)。虽然能够在不破坏核心Spring AOP API的状况下添加对字段拦截的支持,但未实现字段拦截。若是您须要建议字段访问和更新链接点,请考虑使用AspectJ等语言。Spring AOP的AOP方法与大多数其余AOP框架的方法不一样。目的不是提供最完整的AOP实现(尽管Spring AOP很是强大)。相反,目标是在AOP实现和Spring IoC之间提供紧密集成,以帮助解决企业应用程序中的常见问题。所以,例如,Spring Framework的AOP功能一般与Spring IoC容器一块儿使用。经过使用普通bean定义语法来配置方面(尽管这容许强大的“自动代理”功能)。这是与其余AOP实现的重要区别。使用Spring AOP没法轻松或高效地完成某些操做,例如建议很是细粒度的对象(一般是域对象)。在这种状况下,AspectJ是最佳选择。可是,咱们的经验是Spring AOP为适合AOP的企业Java应用程序中的大多数问题提供了出色的解决方案。框架
1.AOP的做用工具
在OOP中,正是这种分散在各处且与对象核心功能无关的代码(横切代码)的存在,使得模块复用难度增长。AOP则将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),切面将那些与业务无关,却被业务模块共同调用的逻辑提取并封装起来,减小了系统中的重复代码,下降了模块间的耦合度,同时提升了系统的可维护性。spa
2.DI 和 IOC 概念代理
依赖注入或控制反转的定义中,调用者不负责被调用者的实例建立工做,该工做由Spring框架中的容器来负责,它经过开发者的配置来判断实例类型,建立后再注入调用者。因为Spring容器负责被调用者实例,实例建立后又负责将该实例注入调用者,所以称为依赖注入。而被调用者的实例建立工做再也不由调用者来建立而是由Spring来建立,控制权由应用代码转移到了外部容器,控制权发生了反转,所以称为控制反转。对象
3.BeanFactory与ApplicationContext接口
ApplicationContext是BeanFactory的子接口,也被称为应用上下文。BeanFactory提供了Spring的配置框架和基本功能,ApplicationContext则添加了更多企业级功能(如国际化的支持),他另外一重要优点在于当ApplicationContext容器初始化完成后,容器中全部的 singleton Bean 也都被实例化了,也就是说当你须要使用singleton Bean 是,在应用中无需等待就能够用,而其余BeanFactory接口的实现类,则会延迟到调用 getBean()方法时构造,ApplicationContext的初始化时间会稍长些,调用getBean()是因为Bean已经构造完毕,速度会更快。所以大部分系统都使用ApplicationContext,而只在资源较少的状况下,才考虑使用BeanFactory。资源
4.AOP的实现策略开发
(1)Java SE动态代理:
使用动态代理能够为一个或多个接口在运行期动态生成实现对象,生成的对象中实现接口的方法时能够添加加强代码,从而实现AOP。缺点是只能针对接口进行代理,另外因为动态代理是经过反射实现的,有时可能要考虑反射调用的开销。
(2)字节码生成(CGLib 动态代理)
动态字节码生成技术是指在运行时动态生成指定类的一个子类对象,并覆盖其中特定方法,覆盖方法时能够添加加强代码,从而实现AOP。其经常使用工具是cglib。
(3)定制的类加载器
当须要对类的全部对象都添加加强,动态代理和字节码生成本质上都须要动态构造代理对象,即最终被加强的对象是由AOP框架生成,不是开发者new出来的。解决的办法就是实现自定义的类加载器,在一个类被加载时对其进行加强。JBoss就是采用这种方式实现AOP功能。
(4)代码生成
利用工具在已有代码基础上生成新的代码,其中能够添加任何横切代码来实现AOP。
(5)语言扩展
能够对构造方法和属性的赋值操做进行加强,AspectJ是采用这种方式实现AOP的一个常见Java语言扩展。get
核心概念io
一、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
二、切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象
三、链接点(joinpoint)
被拦截到的点,由于Spring只支持方法类型的链接点,因此在Spring中链接点指的就是被拦截到的方法,实际上链接点还能够是字段或者构造器
四、切入点(pointcut)
对链接点进行拦截的定义
五、通知(advice)
所谓通知指的就是指拦截到链接点以后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
六、目标对象
代理的目标对象
七、织入(weave)
将切面应用到目标对象并致使代理对象建立的过程
八、引入(introduction)
在不修改代码的前提下,引入能够在运行期为类动态地添加一些方法或字段