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组件
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。