Spring加载时,会使用ClassLoader去查找所有能找到的"META-INF/spring.handlers"文件,并存放在handlerMappings中(DefaultNamespaceHandlerResolver在干这事),遇到除beans外的Namespace,就会去这里查找对应的解析器,如果不存在就报错,存在就使用相应的解析器进行解析。
<aop>是由AopNamespaceHandler来进行解析的。
AspectJAutoProxyBeanDefinitionParser会注册3个类来处理解析任务,分别对应为:
"config", new ConfigBeanDefinitionParser();
"aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser();
"scoped-proxy", new ScopedProxyBeanDefinitionDecorator();
要使用aop命名空间,需要在spring的xml中加入:
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-xsd"
这样便可以在该xml中使用<aop .../>了。
<aop:aspectj-autoproxy/>
使用该配置后,AspectJAutoProxyBeanDefinitionParser会注册AnnotationAwareAspectJAutoProxyCreator到Spring管理的bean中。由于AnnotationAwareAspectJAutoProxyCreator是BeanPostProcessor,所以在所有bean初始化完成后,都会调用该类中的postProcessAfterInitialization来进行处理。
AnnotationAwareAspectJAutoProxyCreator使用findEligibleAdvisors来查找是否有bean对应的Advisors(注册在当前beanFactory中的实现了Advisor接口的类,例如BeanFactoryTransactionAttributeSourceAdvisor),如果有,创建一个该bean的代理(AbstractAutoProxyCreator)。
如果使用了<tx:annotation-driven/>,其中的mode属性默认为proxy,解析到这里的时候,AnnotationDrivenBeanDefinitionParser会自动调用AopNamespaceUtils->AopConfigUtils,而AopConfigUtils会把AnnotationAwareAspectJAutoProxyCreator注册到beanFactory里面去,也就是相当于写了个<aop:aspectj-autoproxy/>的标签。
如果不知道程序应该使用Spring-AOP还是AspectJ,这儿有较好的描述:
http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/aop.html#aop-choosing
Spring-AOP默认使用JDKProxy来代理实现了任何接口的类,如果没有实现任何接口,则使用Cglib2AopProxy来创建代理,对原类的方法调用时,会根据代理类设置的Callback[]进行相应处理。
Spring-AOP默认设置的Callback有
DynamicAdvisedInterceptor(拦截方法调用,检查需要使用的拦截器并执行,例如TransactionInterceptor)
DynamicUnadvisedInterceptor/StaticUnadvisedInterceptor
StaticDispatcher
AdvisedDispatcher(不知道拿来干嘛的)
EqualsInterceptor
HashCodeInterceptor
SerializableNoOp(貌似没啥用?)
分享到:
相关推荐
这部分定义了Spring的命名空间,其中`xmlns`属性指定的是Spring Bean的命名空间URI,而`xsi:schemaLocation`属性则指定了XSD模式文件的位置,这里使用的版本为2.5。 ##### 2.3 定义拦截器 ```xml ...
使用AspectJ配置文件方式实现AOP操作时,需要在Spring配置文件中配置AOP命名空间,并定义切面类和切入点表达式。接着,可以通过配置自动代理生成器来创建代理对象,并将这些代理对象应用到目标类上。 值得注意的是...
我们需要引入AOP命名空间,并声明一个`<aop:config>`元素来启用AOP功能: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:...
在上面的配置文件中,我们可以看到 Context 文件中定义了多个命名空间,包括 beans、aop、tx、context 等这些命名空间用于定义不同的配置信息。 结论: Spring AOP 配置事务方法提供了一种灵活的方式来实现事务...
- 创建`applicationContext.xml`配置文件,导入AOP相关的命名空间:`<aop:config>`和`<aop:aspect>`。 - 定义切入点表达式(Pointcut Expression),这是一段用于匹配特定方法的表达式,例如`execution(* ...
1. 在`spring-common.xml`配置文件中,我们需要引入AOP相关的命名空间,并声明一个`<aop:aspectj-autoproxy>`元素。这会告诉Spring容器,我们要启用基于注解的AOP,并代理所有带有切面注解的bean。配置如下: ```...
在Spring的AOP命名空间中,你可以使用如`<aop:advisor>`、`<aop:after>`等标签来定义通知。这种方式允许你以声明的方式配置切面,而无需实现特定的接口或使用注解。 **第四种:注入式AspectJ切面** 这种切面利用...
这个表达式匹配所有在 `MyNamespace` 命名空间下的公共方法。 4. **将切面应用到目标对象**:最后,我们需要将切面应用到需要拦截的方法或类型上。这可以通过 `<advise>` 标签实现: ```xml , MyAssembly"> <aop:...
1. **配置Spring容器**:首先,确保Spring的配置文件(如`applicationContext.xml`)已经包含了AOP的命名空间,通常添加如下: ```xml xmlns:aop="http://www.springframework.org/schema/aop" ...
1 需要在xml文件中加入命名空间 可以在spring-framework-4.0.6.RELEASE\docs\spring-framework-reference\html 中搜索关键字查找配置 2 加入需要的jar包(依赖包) 由于没有引入 spring-aop-4.0.6.RELEASE.jar 引起的...
HDFS采用了主从架构,Master节点负责管理文件系统的命名空间和客户端对文件的访问,而DataNode则负责存储实际的数据块。 #### 2. YARN YARN(Yet Another Resource Negotiator)是MapReduce 2.0的核心组件之一,它...
在Spring的配置文件中,我们需要引入AOP的命名空间。这可以通过添加`<aop:config>`或`<aop:aspectj-autoproxy>`元素来完成。前者使用Spring AOP的原生API,后者则使用AspectJ的自动代理机制。 2. **定义切面**: ...
首先,我们需要在Spring配置文件中添加AOP的命名空间,例如: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context=...
4. **配置缓存管理**:在Spring配置文件中,需要定义缓存配置,包括缓存命名空间、过期策略、缓存大小等。 通过Spring AOP,我们可以轻松地将这些缓存策略应用于业务逻辑,无需对原有代码进行大量修改。 **四、...
1. 引入AOP命名空间: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" ...
**Schema-based配置**使用Spring的AOP命名空间,直接在XML中定义切面。**@AspectJ注解配置**是最为直观的方式,通过在切面类上使用@Aspect、@Pointcut、@Before等注解,可以直接在Java代码中声明切面逻辑。 Spring ...
1. 配置:在`applicationContext.xml`中引入AOP命名空间,并配置切面、通知和代理。 2. 定义接口和服务实现:例如创建一个`TestService`接口和它的实现类`TestServiceImpl`。 3. 创建通知类:这里可以是实现`...
在Spring的配置文件中,你需要引入AOP的命名空间: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop=...