aop:aspectj-autoproxy标签

    <aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>

1、spring.handlers中配置了namespace和NamespaceHandler的对应关系http://www.springframework.org/schema/aop=org.springframework...
2、查找AopNamespaceHandler
根据<aop/>标签,找到applicationContext对应的名字空间,根据名字空间找到AopNamespaceHandler
3、调用AopNamespaceHandler#parse方法,
查找parser AspectJAutoProxyBeanDefinitionParser
4、调用AspectJAutoProxyBeanDefinitionParser#parse
AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(parserContext, element);
注册AnnotationAwareAspectJAutoProxyCreator类的RootBeanDefinition
设置proxy-target-class、expose-proxy属性

aop:config标签

<aop:config>
       <aop:pointcut id="pointCut" expression="execution(public * com.aop.test08.xml.UserServiceXml.*(..))"/>
       <aop:advisor advice-ref="beforeAdvice" pointcut-ref="pointCut" />
       <aop:advisor advice-ref="methodIterceptor" pointcut-ref="pointCut" />
       <aop:aspect ref="aspect">
            <aop:before method="before" pointcut-ref="pointCut"/>
            <aop:after method="after" pointcut-ref="pointCut"/>
            <aop:around method="around" pointcut-ref="pointCut"/>
            <aop:after-returning method="afterReturning" pointcut-ref="pointCut"/>
            <aop:after-throwing method="afterThrowing" pointcut-ref="pointCut"/>
       </aop:aspect>
</aop:config>

1、spring.handlers中配置了namespace和NamespaceHandler的对应关系
http\://www.springframework.org/schema/aop=org.springframework.aop.config.AopNamespaceHandler
2、查找AopNamespaceHandler
根据<aop/>标签,找到applicationContext对应的名字空间,根据名字空间找到AopNamespaceHandler
3、调用AopNamespaceHandler#parse方法,
查找parser ConfigBeanDefinitionParser
4、调用ConfigBeanDefinitionParser#parse
AopNamespaceUtils.registerAspectJAutoProxyCreatorIfNecessary(parserContext, element);
注册AspectJAwareAutoProxyCreator类的RootBeanDefinition,设置proxy-target-class、expose-proxy属性

解析pointcut标签,AspectJExpressionPointcut
解析advisor标签,DefaultBeanFactoryPointcutAdvisor,设置advice和pointcut
解析aspect的<aop:before>标签,AspectPointcutAdvisor, before解析为AspectJMethodBeforeAdvice
解析aspect的<aop:after>标签,AspectPointcutAdvisor, after解析为AspectJAfterAdvice
解析aspect的<aop:around>标签,AspectPointcutAdvisor, around解析为AspectAroundAdvice
解析aspect的<aop:after-returning>标签,AspectPointcutAdvisor, after-returning解析为AspectJAfterReturningAdvice
解析aspect的<aop:after-throwing>标签,AspectPointcutAdvisor, after-throwing解析为AspectJAfterThrowingAdvice

context:annotation-config标签
开启注解驱动开发

    <context:annotation-config />

1、ContextNamespaceHandler
2、AnnotationConfigBeanDefinitionParser解析标签
3、注册ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor等

context:component-scan标签
开启组件扫描

<context:component-scan base-package="com.tx.test12" />

1、ContextNamespaceHandler
2、ComponentScanBeanDefinitionParser解析标签
3、解析过程,利用ClassPathBeanDefinitionScanner扫描bean

tx:annotation-driven标签
开启注解驱动开发

    <tx:annotation-driven transaction-manager="transactionManager" mode="proxy"/>

1、TxNamespaceHandler
2、AnnotationDrivenBeanDefinitionParser解析标签
3、解析过程
注册BeanPostProcessor组件,InfrastructureAdvisorAutoProxyCreator组件
注册事务相关组件,AnnotationTransactionAttributeSource、TransactionInterceptor、BeanFactoryTransactionAttributeSourceAdvisor组件

context:property-placeholder标签

    <context:property-placeholder ignore-unresolvable="true" local-override="true" location="classpath:jdbc.properties" />

1、ContextNamespaceHandler解析
2、PropertyPlaceholderBeanDefinitionParser
3、实际上是一个BeanFactoryPostProcessor#invokeBeanFactoryPostProcessors()时,会执行postProcessBeanFactory方法,替换BeanDefinition中的$变量

tx:advice标签

<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!--<tx:method name="insert*" propagation="REQUIRED" timeout="1000" rollback-for="java.lang.Exception"/>-->
        <tx:method name="insert*" propagation="REQUIRED" timeout="1000" rollback-for="java.lang.Exception"/>
        <tx:method name="get*" propagation="SUPPORTS" />
    </tx:attributes>
</tx:advice>

1、TxNamespaceHandler解析
2、TxBeanDefinitionAdvice
3、注册TransactionInterceptor组件

mvc:interceptors标签

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <ref bean="logInterceptor"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <ref bean="oAuthInterceptor"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/users/getUsers"/>
        <ref bean="timeInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

1、利用MvcNamespaceHandler解析
2、InterceptorsBeanDefinitionParser
3、注册为MappedInterceptor组件,包含HandlerInterceptor和PathMatcher

mvc:annotation-driven标签

<mvc:annotation-driven conversion-service="formattingConversionService"/>

1、利用MvcNamespaceHandler解析
2、AnnotationDrivenBeanDefinitionParser
3、注册RequestMappingHandlerMapping组件、RequestMappingHandlerAdapter、ConversionServiceExposingInterceptor、ExceptionHandlerExceptionResolver、ResponseStatusExceptionResolver、DefaultHandlerExceptionResolver

mvc:default-servlet-handler标签

<mvc:default-servlet-handler/>

1、DefaultServletHandlerBeanDefinitionParser
2、DefaultServletHttpRequestHandler和SimpleUrlHandlerMapping组件

mvc:resources标签

 <mvc:resources mapping="/static/**" location="/WEB-INF/static/"/>

1、ResourcesBeanDefinitionParser
2、注册ResourceHttpRequestHandler组件


一只鱼
49 声望1 粉丝