在最近的Blog中,Rod Johnson介绍了Spring应用程序的一个新的配置选项,这个新的配置选项并不是打算来取代Spring的基于XML的配置。新的选项在Java类中定义了配置,这个配置Rod Johnson描述为一个小的配置DSL。
值得提到的一点就是,人们经常忽略Spring配置不需要在XML文件中,虽然XML的形式是目前最通用的使用形式。Spring在BeanDefinition接口和子接口的形式上有自己的内部的元数据形式。 代表IOC容器实例的BeanFactory和ApplicationContext的实现被这种Java元数据赋有强大的动力。并且从元数据的解析中各自分离,这通常是由BeanDefinitionReader实现来执行的。
BeanDefinition最初并不是按开发者的观点来设计的,Spring2.0,NamespaceHandlers(处理XML扩展命名空间的类)产生BeanDefinition元数据,我们引进BeanDefinition,用方便的API使得这更加容易。但是产生BeanDefinition元数据只不过留在架构代码的领域,而不是像你每天写业务逻辑代码和定义规则的Spring bean所做的那样。
今天,我想要描述一个新的选项来在Java代码中定义beans,当前是Spring core增加的扩展功能。
首先来看一个例子:
|
@Configuration注释标识这个对象作为一个特殊配置类,每一个@Bean方法定义了一个bean。bean的名字是方法的名字,它也可以用注释来定义而外的名字。但是最好从方法中选择名字,而不是注释中,这就像编译器能够确保其唯一性一样。
Beans在Java代码中配置,使用构造器,属性或者任意的方法调用,我们注意到调用另外一个bean方法建立了一个从”book” bean到”rod” bean的依赖。但是在Java的实例对象中没有框架的支持有一个主要的优点:
例如:
每个@Bean是Spring组件并能利用所有的Spring服务,例如声明事务管理。
每个public @Bean方法被增加到Spring容器中,因此注入到其他对象,JMX导出和其他定义中是可以的。
在现存的Spring环境中是适合的。
通过比较XML定义来完成同样的结果是更容易的,就象下面这样:
|
虽然这是基于Java注释的,Java配置机制在注释的使用上是唯一的,注释并没有包含在核心的业务逻辑中,而是在每个独立的配置类中。对配置来说,这是DSL,因此,它保留了Spring的非侵入允诺。,你可以不必改变Java代码来使用。
这个配置类,类似与一个XML bean定义文件,并且这样的@Configuration注释包含一些对<bean>元素相似的选项,像默认的延迟初始化,例如:
|
@Bean注释允许像范围,延迟初始化选项在本地设置,正如<bean>元素,默认的范围是Singleton。
@Configuration注释标识这个对象作为一个特殊配置类,每一个@Bean方法定义了一个bean。bean的名字是方法的名字,它也可以用注释来定义而外的名字。但是最好从方法中选择名字,而不是注释中,这就像编译器能够确保其唯一性一样。
Beans在Java代码中配置,使用构造器,属性或者任意的方法调用,我们注意到调用另外一个bean方法建立了一个从“book”bean到“rod”bean的依赖。但是在Java的实例对象中没有框架的支持有一个主要的优点:
例如:每个@Bean是Spring组件并能利用所有的Spring服务,例如声明事务管理。每个public @Bean方法被增加到Spring容器中,因此注入到其他对象,JMX导出和其他定义中是可以的。在现存的Spring环境中是适合的。通过比较XML定义来完成同样的结果是更容易的,就象下面这样:虽然这是基于Java注释的,Java配置机制在注释的使用上是唯一的,注释并没有包含在核心的业务逻辑中,而是在每个独立的配置类中。对配置来说,这是DSL,因此,它保留了Spring的非侵入允诺。你可以不必改变Java代码来使用。
这个配置类,类似与一个XML bean定义文件,并且这样的@Configuration注释包含一些对<bean>元素相似的选项,像默认的延迟初始化,例如:@Bean注释允许像范围,延迟初始化选项在本地设置,正如<bean>元素,默认的范围是Singleton。
(责任编辑 火凤凰 sunsj@51cto.com TEL:(010)68476636-8007)