`
seed
  • 浏览: 26124 次
  • 性别: Icon_minigender_1
  • 来自: 广东·佛山·南海
社区版块
存档分类
最新评论

Spring TargetSources介绍

阅读更多

来源:http://www.softstudio.com.cn/leadbbs/Announce/announce2.asp?BoardID=200&ID=183&TopicSortID=183

5.10. 使用TargetSources
Spring提供了TargetSource的概念,由 org.springframework.aop.TargetSource接口定义。这个接口负责返回实现切入点的 “目标对象”。每次AOP代理处理方法调用时,目标实例都会用到TargetSource实现。

使用Spring AOP的开发者一般不需要直接使用TargetSources,但是这提供了一种强大的方法来支持池,热交换, 和其它复杂目标。例如,一个支持池的TargetSource可以在每次调用时返回不同的目标对象实例,使用池来管理实例。

如果你没有指定TargetSource,就使用缺省的实现,它封装了一个本地对象。每次调用会返回相同的目标对象 (和你期望的一样)。

让我们来看一下Spring提供的标准目标源,以及如何使用它们。

当使用定制目标源时,你的目标通常需要定义为prototype bean,而不是singleton bean。这使得 Spring在需要的时候创建一个新的目标实例。
5.10.1. 可热交换的目标源
org.springframework.aop.target.HotSwappableTargetSource 允许切换一个AOP代理的目标,而调用者维持对它的引用。

修改目标源的目标会立即起作用。并且HotSwappableTargetSource是线程安全的。

你可以通过HotSwappableTargetSource的swap()方法 来改变目标,就象下面一样:

HotSwappableTargetSource swapper =
    (HotSwappableTargetSource) beanFactory.getBean("swapper");
Object oldTarget = swapper.swap(newTarget);
所需的XML定义如下:

xml 代码
  1. <bean id="initialTarget" class="mycompany.OldTarget">  
  2. </bean>  
  3.   
  4. <bean id="swapper"  class="org.springframework.aop.target.HotSwappableTargetSource">  
  5.     <constructor-arg>  
  6.          <ref local="initialTarget"/>  
  7.     </constructor-arg>  
  8. </bean>  
  9.   
  10. <bean id="swappable" class="org.springframework.aop.framework.ProxyFactoryBean">  
  11.     <property name="targetSource">  
  12.         <ref local="swapper"/>  
  13.     </property>  
  14. </bean>  


上面的swap()调用会修改swappable这个bean的目标。持有对这个bean应用的客户端 将不会知道这个变化,但会立刻转为使用新的目标对象。

虽然这个例子没有添加任何通知--使用TargetSource也没必要添加通知-- 当然任何TargetSource都可以和任何一种通知一起使用。

5.10.2. 支持池的目标源
使用支持池的目标源提供了一种和无状态的session EJB类似的编程模式,在无状态的session EJB中,维护了 一个相同实例的池,提供从池中获取可用对象的方法。

Spring的池和SLSB的池之间的重要区别在于Spring的池可以被应用到任何普通Java对象。就象Spring的通用 的做法,这个业务也可以以非侵入的方式被应用。

Spring直接支持Jakarta Commons Pool 1.1,它是一种非常高效的池实现。使用这个功能,你需要在你的应用的 classpath中添加commons-pool的Jar文件。也可以直接继承 org.springframework.aop.target.AbstractPoolingTargetSource来支持其它池API。

下面是一个配置的例子:

   

xml 代码
  1. <bean id="businessObjectTarget" class="com.mycompany.MyBusinessObject"   singleton="false">  
  2.     ... properties omitted   
  3. </bean>  
  4.   
  5. <bean id="poolTargetSource"    
  6.     class="org.springframework.aop.target.CommonsPoolTargetSource">  
  7.     <property name="targetBeanName"><value>businessObject</value></property>  
  8.     <property name="maxSize"><value>25</value></property>  
  9. </bean>  
  10.   
  11. <bean id="businessObject"   class="org.springframework.aop.framework.ProxyFactoryBean">  
  12.     <property name="targetSource"><ref local="poolTargetSource"/></property>  
  13.     <property name="interceptorNames"><value>myInterceptor</value></property>  
  14. </bean>  

  

<bean class="com.mycompany.MyBusinessObject" id="businessObjectTarget"></bean>
注意例子中的目标对象“businessObjectTarget”必须是prototype。这样在 PoolingTargetSource的实现在扩大池容量的时候可以创建目标的新实例。关于这些属性的 信息可以参考AbstractPoolingTargetSource和子类的Javadoc。maxSize是最基本的属性, 被保证总是存在。

在这种情况下,名字为“myInterceptor”的拦截器需要定义在同一个IoC上下文中。但是,并不一定需要 指定拦截器也用池。如果你仅需要池,并且没有其它通知,可以根本不设置属性interceptorNames。

也可以配置Spring以便可以将任何池化的对象转换类型为 org.springframework.aop.target.PoolingConfig接口。通过这个接口的一个引入,可以得到 配置信息和池的当前大小。你需要这样定义一个advisor:

<bean id="poolConfigAdvisor"></bean>    

xml 代码

<bean id="poolConfigAdvisor"></bean>

  1. <bean id="poolConfigAdvisor"    
  2.     class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">  
  3.     <property name="target"><ref local="poolTargetSource" /></property>  
  4.     <property name="targetMethod"><value>getPoolingConfigMixin</value></property>  
  5. </bean>  



通过调用AbstractPoolingTargetSource类上的方法,可以得到这个advisor, 因此使用MethodInvokingFactoryBean。这个advisor的名字(“poolConfigAdvisor”)必须在暴露池化对象的 This advisor is obtained by calling a convenience method on the ProxyFactoryBean中的拦截器名字列表中。

这个类型转换就象下面:

java 代码
  1. PoolingConfig conf = (PoolingConfig) beanFactory.getBean("businessObject");   
  2. System.out.println("Max pool size is " + conf.getMaxSize());  



池化无状态业务对象并不是总是必要的。我们不认为这是缺省选择,因为大多数无状态对象自然就是线程 安全的,如果资源被缓存,实例池化会有问题。
简单的池也可以使用自动代理。任何自动代理生成器都可以设置TargetSources。

5.10.3. Prototype目标源
设置“prototype”目标源和支持池的目标源类似。在每次方法调用的时候都会创建一个新的目标实例。 虽然在现代JVM中创建对象的代价不是很高,但是装配新对象的代价可能更高(为了maz满足它的IoC依赖关系)。 因此没有好的理由不应该使用这个方法。

为了这么做,你可以修改上面的的poolTargetSource定义,就向下面一样。 (为了清晰起见,我修改了名字。)

xml 代码
  1. <bean id="prototypeTargetSource"    
  2.     class="org.springframework.aop.target.PrototypeTargetSource">  
  3.     <property name="targetBeanName"><value>businessObject</value></property>  
  4. </bean>  

   

只有一个属性:目标bean的名字。在TargetSource实现中使用继承是为了保证命名的一致性。就象支持池的 目标源一样,目标bean必须是一个prototype的bean定义。

5.11. 定义新的通知类型
Spring AOP设计能够很容易地扩展。虽然拦截实现的策略目前只在内部使用,但还是有可能支持拦截around通知, before通知,throws通知和after returning通知以外的任何通知类型。

org.springframework.aop.framework.adapter 包是一个支持添加新的定制通知类型而不修改核心框架的SPI(译:可能是API)包。定制通知类型的唯一限制是它必须实现 org.aopalliance.aop.Advice标记接口。

更多信息请参考org.springframework.aop.framework.adapter包的Javadoc。

5.12. 进一步的资料和资源
对于AOP的介绍,我推荐Ramnivas Laddad (Manning, 2003)写的AspectJ in Action。

进一步的Spring AOP的例子请参考Spring的示例应用:

JPetStore的缺省配置演示了使用TransactionProxyFactoryBean来定义声明式事务管理。

JPetStore的/attributes目录演示了属性驱动的声明式事务管理。

如果你对Spring AOP更多高级功能感兴趣,可以看一下测试套件。测试覆盖率超过90%,并且演示了本文档没有提到 的许多高级功能。

5.13. 路标
Spring AOP,就象Spring的其它部分,是开发非常活跃的部分。核心API已经稳定了。象Spring的其它部分一样, AOP框架是非常模块化的,在保留基础设计的同时提供扩展。在Spring 1.1到1.2阶段有很多地方可能会有所提高,但是这 些地方也保留了向后兼容性。它们是:

性能的提高:AOP代理的创建由工厂通过策略接口处理。因此我们能够支持额外的AOP 代理类型而不影响用户代码或核心实现。对于Spring 1.1,我们正在检查AOP代理实现的所有字节码,万一不需要 运行时通知改变。这应该大大减少AOP框架的额外操作。但是注意,AOP框架的额外操作不是在普通使用中需要考虑 的内容。

更具表达力的切入点:Spring目前提供了一个具有表达力的切入点接口,但是我们 添加更多的切入点实现。我们正在考虑提供一个简单但具有强大表达式语言的实现。如果你希望贡献一个有用的 切入点实现,我们将非常欢迎。

引入方面这个高层概念,它包含多个advisor。

分享到:
评论
1 楼 sun128837 2009-03-17  
请教:在一个页面内有俩frame,两个frame访问不同的页面。使用HotSwappableTargetSource 请求4、5次就会有发现数据源不正常的的访问,也就是说数据源切换不正常
希望能指教一下

相关推荐

    Spring-Reference_zh_CN(Spring中文参考手册)

    7.10. 使用TargetSources 7.10.1. 热交换目标源 7.10.2. 池化目标源 7.10.3. 原型目标源 7.10.4. ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. ...

    Spring 2.0 开发参考手册

    7.10. 使用TargetSources 7.10.1. 热交换目标源 7.10.2. 池化目标源 7.10.3. 原型目标源 7.10.4. ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成...

    spring chm文档

    7.10. 使用TargetSources 7.10.1. 热交换目标源 7.10.2. 池化目标源 7.10.3. 原型目标源 7.10.4. ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成...

    spring-aop-3.2.0.RELEASE-sources.jar.zip

    本文将围绕"spring-aop-3.2.0.RELEASE-sources.jar.zip"这个源码包,深入解析Spring AOP的核心概念和实现机制。 一、AOP概述 AOP的核心理念在于将横切关注点(如日志、安全检查)与业务逻辑分离,提高代码的可读性...

    spring.net中文手册在线版

    12.9.使用TargetSources 12.9.1.动态切换TargetSource 12.9.2.池化TargetSource 12.9.3.PrototypeTargetSource 12.10.定义新的通知类型 12.11.参考资源 第十三章.通用日志抽象层 13.1.简介 13.1.1.Logging API 13.2....

    spring-framework-reference-4.1.2

    3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................

    spring boot项目打包成war在tomcat运行的全步骤

    执行完成后,`target`目录下将会生成一个WAR文件。将这个WAR文件复制到Tomcat服务器的`webapps`目录下,然后启动Tomcat。Tomcat会自动解压并部署WAR文件。应用的访问路径通常是`...

    spring-framework-reference4.1.4

    3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................

    piggsoft-spring:Spring MVC Maven原型

    piggsoft-spring Spring MVC Maven archetype Spring MVC Maven 模板文件 ...mvn clean archetype:create-from-project & cd target/generated-sources/archetype/ & mvn clean install & cd D:/ & mvn archetype:

    primefaces-spring-data-example:使用 Spring Data 在 Primefaces 中实现 LazyDataModel 的项目

    这个元数据类是在编译这个模块后创建的,你可以在target/generated-sources/java文件夹中找到它们。 当 Maven 将此模块打包在 JAR 中时,所有这些元数据类也被包含在内。 QueryDSL 允许我们在代码中显式定义 HQL/...

    如何把spring boot项目部署到tomcat容器中

    在项目根目录下执行`mvn clean package`,等待打包完成后,你会在`target`目录下找到生成的WAR文件。将这个WAR文件复制到Tomcat的`webapps`目录下,然后启动Tomcat。Tomcat会自动解压并部署WAR文件。你可以通过访问`...

    bos-spring-boot-ws-sample:Java Spring Boot WS客户端AngularJS Thymeleaf

    1.2执行:mvn clean package 1.3现在,您将在target \ Generated-sources \ xjc文件夹中看到Spring WS SOAP客户端域对象1.4您可以将其复制到src \ main \ java 1.5复制回所有其他文件。 有关更多信息,请访问链接 ...

    springboot 打成war包 部署至tomcat 中间件运行

    4. **构建WAR包**:运行`mvn clean package`命令,Maven将会生成一个WAR文件在`target`目录下。 5. **部署到Tomcat**:将生成的WAR文件复制到Tomcat的`webapps`目录下。如果Tomcat正在运行,它会自动解压并加载应用...

    Spring Boot 项目发布到 Tomcat 服务器的操作步骤

    Spring Boot 项目发布到 Tomcat 服务器的操作步骤主要介绍了将 Spring Boot 项目发布到 Tomcat 服务器的详细操作步骤。以下是详细的操作步骤: 第 1 步:设置 Spring Boot 项目的打包方式 在 Spring Boot 项目中,...

    spring_lab:Spring MVC,REST,JPA,JSON,JUnit,引导程序-FullProject

    键入以下命令来构建和部署归档文件: mvn clean install jboss-as:deploy这会将target/spring_lab.war部署到正在运行的服务器实例。访问应用程序该应用程序将在以下URL上运行: 。 您也可以从Codevny运行该应用程序...

    详解spring boot jpa整合QueryDSL来简化复杂操作

    &lt;outputDirectory&gt;target/generated-sources/java &lt;processor&gt;com.querydsl.apt.jpa.JPAAnnotationProcessor&lt;/processor&gt; ``` 三、生成查询类型 使用QueryDSL生成查询类型的过程中,会查找使用javax....

    Spring boot 基本部署方式

    这将在`target`目录下生成一个war包和一个包含包内文件的文件夹。 在Ubuntu 16.04系统上,Tomcat的默认安装位置是`/var/lib/tomcat8/webapps`。你可以在这里创建一个与war包同名的文件夹,例如`demo`,然后将war包...

    Spring Boot整合QueryDSL的实现示例

    &lt;outputDirectory&gt;target/generated-sources/java &lt;processor&gt;com.querydsl.apt.jpa.JPAAnnotationProcessor&lt;/processor&gt; ... ``` 配置完成后,Querydsl会根据你的JPA实体类自动生成对应的查询类型,...

    springboot集成mariaDB,mybatis自动生成对应的mapper,pojo,dao类文件

    &lt;id&gt;generate-sources &lt;goal&gt;generate &lt;configurationFile&gt;src/main/resources/generatorConfig.xml &lt;verbose&gt;true &lt;overwrite&gt;true ``` 通过上述步骤,我们可以实现Spring Boot应用与...

    spring-cxf-webservices

    要生成客户端使用的类,请使用 mvn generate-sources(在 /target/generated 中生成的@WebServiceClient 类) 请注意,为了从上述两个服务的公开 wsdl 生成类,必须在容器(例如 Tomcat)上部署和运行这些服务

Global site tag (gtag.js) - Google Analytics