`
phoenix520
  • 浏览: 142245 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring命名空间之AOP

 
阅读更多

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之AOP配置文件详解

    这部分定义了Spring的命名空间,其中`xmlns`属性指定的是Spring Bean的命名空间URI,而`xsi:schemaLocation`属性则指定了XSD模式文件的位置,这里使用的版本为2.5。 ##### 2.3 定义拦截器 ```xml ...

    Spring5_AOP.pdf

    使用AspectJ配置文件方式实现AOP操作时,需要在Spring配置文件中配置AOP命名空间,并定义切面类和切入点表达式。接着,可以通过配置自动代理生成器来创建代理对象,并将这些代理对象应用到目标类上。 值得注意的是...

    spring1.x使用AOP实例

    我们需要引入AOP命名空间,并声明一个`&lt;aop:config&gt;`元素来启用AOP功能: ```xml &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:...

    Spring AOP配置事务方法

    在上面的配置文件中,我们可以看到 Context 文件中定义了多个命名空间,包括 beans、aop、tx、context 等这些命名空间用于定义不同的配置信息。 结论: Spring AOP 配置事务方法提供了一种灵活的方式来实现事务...

    SpringAOP的例子

    - 创建`applicationContext.xml`配置文件,导入AOP相关的命名空间:`&lt;aop:config&gt;`和`&lt;aop:aspect&gt;`。 - 定义切入点表达式(Pointcut Expression),这是一段用于匹配特定方法的表达式,例如`execution(* ...

    spring mvc框架下的aop例子

    1. 在`spring-common.xml`配置文件中,我们需要引入AOP相关的命名空间,并声明一个`&lt;aop:aspectj-autoproxy&gt;`元素。这会告诉Spring容器,我们要启用基于注解的AOP,并代理所有带有切面注解的bean。配置如下: ```...

    Spring实现AOP的四种方式

    在Spring的AOP命名空间中,你可以使用如`&lt;aop:advisor&gt;`、`&lt;aop:after&gt;`等标签来定义通知。这种方式允许你以声明的方式配置切面,而无需实现特定的接口或使用注解。 **第四种:注入式AspectJ切面** 这种切面利用...

    Spring.net(AOP通过配置文件配置)

    这个表达式匹配所有在 `MyNamespace` 命名空间下的公共方法。 4. **将切面应用到目标对象**:最后,我们需要将切面应用到需要拦截的方法或类型上。这可以通过 `&lt;advise&gt;` 标签实现: ```xml , MyAssembly"&gt; &lt;aop:...

    spring aop xml实现

    1. **配置Spring容器**:首先,确保Spring的配置文件(如`applicationContext.xml`)已经包含了AOP的命名空间,通常添加如下: ```xml xmlns:aop="http://www.springframework.org/schema/aop" ...

    springAOP demo 带错误解决文档

    1 需要在xml文件中加入命名空间 可以在spring-framework-4.0.6.RELEASE\docs\spring-framework-reference\html 中搜索关键字查找配置 2 加入需要的jar包(依赖包) 由于没有引入 spring-aop-4.0.6.RELEASE.jar 引起的...

    Spring-Aop源码实现

    HDFS采用了主从架构,Master节点负责管理文件系统的命名空间和客户端对文件的访问,而DataNode则负责存储实际的数据块。 #### 2. YARN YARN(Yet Another Resource Negotiator)是MapReduce 2.0的核心组件之一,它...

    Spring 基于基于XML配置方式实现AOP

    在Spring的配置文件中,我们需要引入AOP的命名空间。这可以通过添加`&lt;aop:config&gt;`或`&lt;aop:aspectj-autoproxy&gt;`元素来完成。前者使用Spring AOP的原生API,后者则使用AspectJ的自动代理机制。 2. **定义切面**: ...

    Spring AOP中使用args表达式的方法示例

    首先,我们需要在Spring配置文件中添加AOP的命名空间,例如: ```xml &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context=...

    Spring AOP应用

    4. **配置缓存管理**:在Spring配置文件中,需要定义缓存配置,包括缓存命名空间、过期策略、缓存大小等。 通过Spring AOP,我们可以轻松地将这些缓存策略应用于业务逻辑,无需对原有代码进行大量修改。 **四、...

    spring的aop标签使用小程序

    1. 引入AOP命名空间: ```xml &lt;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" ...

    Spring AOP源码深度解析:掌握Java高级编程核心技术

    **Schema-based配置**使用Spring的AOP命名空间,直接在XML中定义切面。**@AspectJ注解配置**是最为直观的方式,通过在切面类上使用@Aspect、@Pointcut、@Before等注解,可以直接在Java代码中声明切面逻辑。 Spring ...

    Spring(aop)讲解

    1. 配置:在`applicationContext.xml`中引入AOP命名空间,并配置切面、通知和代理。 2. 定义接口和服务实现:例如创建一个`TestService`接口和它的实现类`TestServiceImpl`。 3. 创建通知类:这里可以是实现`...

    XML配置SpringAOP共2页.pdf.zip

    在Spring的配置文件中,你需要引入AOP的命名空间: ```xml &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop=...

Global site tag (gtag.js) - Google Analytics