WEB开发网
开发学院软件开发Java Scala与Spring:强强联合 阅读

Scala与Spring:强强联合

 2010-08-04 00:00:00 来源:WEB开发网   
核心提示: 通过将RichDomainObjectFactory声明为Spring bean,Spring容器确保在容器初始化完毕后就设定好了AutowireCapableBeanFactory:<beanclass="org.jsi.di.spring.RichDomainObjectFa

通过将RichDomainObjectFactory声明为Spring bean,Spring容器确保在容器初始化完毕后就设定好了AutowireCapableBeanFactory:

<bean class="org.jsi.di.spring.RichDomainObjectFactory" factory-method="autoWireFactory"/>

这里并没有让Spring容器创建自己的RichDomainObjectFactory实例,而是在bean定义中使用了factory- method属性,它会强制Spring使用autoWireFactory()方法返回的引用,该引用是单例的。这样会将 AutowireCapableBeanFactory注入到单例的RichDomainObjectFactory中。由于可以在同一个类装载器范围内访问单例对象,这样该范围内的所有类都可以使用RichDomainObjectFactory了,它能以一种非侵入、松耦合的方式使用Spring的自动装配特性。毋庸置疑,Scala代码也可以访问到RichDomainObjectFactory单例并使用其自动装配功能。

在设定完这个自动装配工厂后,接下来需要在代码/框架中定义钩子(hook)了。总的来说需要在两个地方定义:

ORM层,它负责从数据库中加载实体

需要“手工”创建新实体的代码中

自动装配ORM层中的领域对象

由于文中的示例代码使用了JPA/Hibernate,因此在实体加载后需要将这些框架所提供的设备挂载到 RichDomainObjectFactory中。JPA/Hibernate提供了一个拦截器API,这样可以拦截和定制实体加载等事件。为了自动装配刚加载的实体,需要使用如下的拦截器实现:

class DependencyInjectionInterceptor extends EmptyInterceptor { 
  override def onLoad(instance:Object, id:Serializable, propertieValues:Array[Object],propertyNames:Array[String], propertyTypes:Array[Type]) = { 
   RichDomainObjectFactory.autoWireFactory.autowire(instance) 
   false 
  } 
}

上一页  3 4 5 6 7 8 9 10  下一页

Tags:Scala Spring 强强联合

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接