spring 3企业开发 6

来源:互联网 发布:js利用for数组排序方法 编辑:程序博客网 时间:2024/05/23 19:36

AOP

 术语

  连接点:是具体事物,包括在哪个方法执行,执行方位是在哪里

 切点:定位连接点。通过数据库查询的概念来理解切点和连接点的关系在合适不过了。连接点相当于数据库中的记录,切点相当于查询条件。切点和连接点不是一一对应的关系,一个切点可以匹配多个连接点。其实确切说,不能 称为查询连接点,因为连接点是方法执行前、后等包括方位信息的具体程序执行点,而切点只定位到某个方法上,所以如果希望定位到具体连接点上,还需求提供方位信息。

增强

    是织入到目标类连接点上的一段程序代码。在spring 中,增强除用于描述一段程序代码外,还拥有另一个和连接点相关的信息,执行点的方位,结合执行点的方位信息和切点信息,可以找到连接点了。

引介:

  引介是一种特殊的增强。他为类增加一些属性和方法。通过aop的引介,可以动态地为该业务添加接口的实现逻辑,让业务类成为这个接口的实现类。

 

切面,有切点和增强组成,

 

JDK动态代理

 

其中invocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射,动态将横切逻辑和业务逻辑编织在一起。可以称invocationhander为织入器。

而proxy利用InvocationHander动态创建一个符合某一接口的实例。

 public class TestForumService{

      public static void main(String args[]){

             ForumService target = new ForumServiceImpl();

            PerformanceHander handler = new PerformanceHandler(target);

            ForumServivce proxy = (ForcumService) Proxy.newProxyInstance(target.getclass().getclassloader(),target.getclass().getinterfaces(),handler);

     }

 

 }

 

public class TestBeforeAdivce{

         public static void main(String args[]){

               Waiter target = new NaiveWaiter();

                BeforeAadive advice = new GreegingBeforeAdivice();

               ProxyFactory pf = new ProxyFactory();

              pf.setTarget(target);

             pf.addadvice(advice);

           Waiter proxy = (Waiter)pf.getProxy();

           proxy.greetTo("john");

       }

 }

 

创建切面

假设我们希望有选择地织入到目标类某些特定方法中,就需要使用切点进行目标链接点的定位了。

增强提供了连接点方位信息,如织入到方法的前面、后面,而切点进一步描述织入到哪些类的哪些方法上。

 

Pointcut   由Classfilter 和 MethodMatcher构成。

切面可以在切点中找到对应物。

 pointcutadvisor 主要有6个具体的实现类。

DefaultPointcutAdvisor  ,常用的切面类型。

NameMatchMehodPointcutAdvisor 通过该类可以定义按方法名定义切点的切面。

RegexpMethodPointcutAdvisor 通过正则表达式进行定义切面

StaticMethodMatcherPointcutAdvisor ,静态方法匹配器切点定义的切面

AspectJExcepressionPointcutAdvisor 用于AspectJ切点表达式定义切点的切面

AspectJPointcutAdvisor 用于AspectJ语法定义切点的切面

 

此外,Advisor都实现了Ordered接口。spring 将根据Advisor定义的顺序决定织入切面的顺序。

 

实现类介绍

  这些基于beanPostProcessor的自动代理创建器的实现类,将根据一些规则自动在容器实例化bean时为匹配的bean生成代理实例。

BeanNameAutoProxyCreator

根据bean的名称,来为代理bean

DefaultAdvisorAutoProxyCreator

我们知道切面AdvisorAutoProxyCreator是切点和增强的复合体。Advisor本身已经包含了足够的信息。横切逻辑(要织入什么)以及连接点(织入到哪里)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击