spring学习笔记(七)

前言

        春节放假归来,收心继续工做学习,前面的笔记介绍了Spring AOP的简单使用,但使用ProxyFactoryBean建立织入切面的代理时,每个须要代理的Bean都须要一个ProxyFactoryBean配置,在有不少的Bean都须要代理时,将增长大量的配置信息,并且这些配置信息有不少都是相同的,这种状况下就应该使用Spring提供的自动建立代理了。
java

自动建立代理

        在内部,Spring使用BeanPostProcessor完成自动建立代理的工做,而BeanPostProcessor的自动代理建立起的实现类,根据匹配规则的不一样大概分红了三类:
spring

  • 匹配Bean的名称自动建立匹配到的Bean的代理,实现类BeanNameAutoProxyCreator学习

  • 根据Advisor的匹配机制自动建立代理,会对容器中全部的Advisor进行扫描,自动将这些切面应用到匹配的Bean中,实现类DefaultAdvisorAutoProxyCreatorspa

  • 根据Bean中的AspectJ注解自动建立代理,实现类AnnotationAwareAspectJAutoProxyCreator.net

BeanNameAutoProxyCreator

        例:如今有一个Waiter类和Seller类都须要织入GreetingBeforeAdvice的加强,使用BeanNameAutoProxyCreator自动建立代理咱们能够以下配置:代理

......
<bean id="waiter" class="com.advisor.Waiter"/>
<bean id="seller" class="com.advisor.Seller"/>
<bean id="advisor" class="com.advisor.GreetingBeforeAdvice" />

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"
    p:beanNames="*er"
    p:interceptorNames="advisor"
    p:optimize="true" />

BeanNameAutoProxyCreator中的beanNames属性值用来匹配其余Bean的名称,例子中*er表示匹配Bean名称以er结尾的Bean织入GreetingBeforeAdvice加强,BeanNameAutoProxyCreator会自动建立代理,使用时直接用获取对应的Bean返回的其实已是代理对象了code

DefaultAdvisorAutoProxyCreator

        例:如今有一个Waiter类和Seller类,他们都有一个greetTo()方法,咱们但愿为两个类中的这个方法都织入GreetingBeforeAdvice加强对象

......
<bean id="waiter" class="com.advisor.Waiter"/>
<bean id="seller" class="com.advisor.Seller"/>
<bean id="advice" class="com.advisor.GreetingBeforeAdvice" />
<bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
    p:patterns=".*greetTo.*"
    p:advice-ref="advice" />

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />

DefaultAdvisorAutoProxyCreator会对容器中全部的Advisor进行扫描,自动将这些切面应用到匹配的Bean中blog

AnnotationAwareAspectJAutoProxyCreator

        使用AnnotationAwareAspectJAutoProxyCreator自动建立代理须要先学习AspectJ表达式,这里就不详细讲解AspectJ表达式了,须要学习的请参考:spring AspectJ的Execution表达式 AspectJ表达式除了execution还有其余的如args()、within()、target()等,有兴趣能够自行研究。继承

        例:使用Aspect实现上一样的例子,在advisor中须要加入AspectJ注解

......

@AspectJ
public class GreetingBeforeAdvisor {
    @Before("execution (* greetTo(..))")
    public void beforeGreeting() {
        ......
    }
}

能够看到如今GreetingBeforeAdvice没有继承任何类,或实现任何接口,@AspectJ已经标注了他是一个切面,而方法上的@Before()表示下面方法中的代码是前置加强的横切逻辑。而后只须要在配置文件中配置:

......
<bean id="waiter" class="com.advisor.Waiter"/>
<bean id="seller" class="com.advisor.Seller"/>
<bean id="advice" class="com.advisor.GreetingBeforeAdvisor" />

<bean class="org.springframework.aop.aspectJ.annotation.AnnotationAwareAspectJAutoProxyCreator" />
<!-- 或者也能够直接使用aop命名空间
<aop:aspectj-autoproxy />
 -->

不一样的加强对应的AspectJ注解

        @Before

        对应前置加强,有两个成员:

    • value:用于定义切点(使用AspectJ表达式)

    • argNames:用于一共方法的参数名称(必须与方法参数名称一致,可选成员),因为Java反射机制不可以获得方法的入参名称,有须要时能够用这个成员变量提供出来

    @AfterReturning

    对应后置加强,有四个成员:

    • value:同上

    • pointcut:表示切点信息,能够显示指定pointcut,若指定覆盖value效果

    • returning:邦队目标对象方法放回加强方法中

    • argNames:同上

    @Around

    对应环绕加强,成员value、argNames同上

    @AfterThrowing

    异常抛出加强,有4个成员

    • value:同上

    • pointcut:同上

    • throwing;将抛出的异常绑定到加强中

    • argNames:同上

    @After

    没有对应的加强接口,无论是抛出异常仍是正常退出总会获得执行,通常用来释放资源,value、argNames同上

    @DeclareParents

    对应引介加强

相关文章
相关标签/搜索