【IT168评论】
在最近的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的名字是方法的名字,它也可以用注释来定义而外的名字.但是最好从方法中选择名字,而不是注释中,这就像编译器能够确保其唯一性一样.
@Configuration

public class MyConfig ...{
@Bean

public Person rod() ...{
return new Person("Rod Johnson");
}
@Bean(scope = Scope.PROTOTYPE)

public Book book() ...{
Book book = new Book("Expert One-on-One J2EE Design and Development");
book.setAuthor(rod()); // rod() method is actually a bean reference !
return book;
}
}
Beans在Java代码中配置,使用构造器,属性或者任意的方法调用,我们注意到调用另外一个bean方法建立了一个从”book” bean到”rod” bean的依赖.但是在Java的实例对象中没有框架的支持有一个主要的优点:例如:
每个@Bean是Spring组件并能利用所有的Spring服务,例如声明事务管理.
每个public @Bean方法被增加到Spring容器中,因此注入到其他对象,JMX导出和其他定义中是可以的.
在现存的Spring环境中是适合的.
通过比较XML定义来完成同样的结果是更容易的,就象下面这样:
虽然这是基于Java注释的,Java配置机制在注释的使用上是唯一的,注释并没有包含在核心的业务逻辑中,而是在每个独立的配置类中.对配置来说,这是DSL,因此,它保留了Spring的非侵入允诺.,你可以不必改变Java代码来使用.
<bean id="rod" class="Person" scope="singleton">
<constructor-arg>Rod Johnson</constructor-arg>
</bean>
<bean id="book" class="Book" scope="prototype">
<constructor-arg>Expert One-on-One J2EE Design and Development</constructor-arg>
<property name="author" ref="rod"/>
</bean>
这个配置类,类似与一个XML bean定义文件,并且这样的@Configuration注释包含一些对<bean>元素相似的选项,像默认的延迟初始化,例如:
@Bean注释允许像范围,延迟初始化选项在本地设置,正如<bean>元素,默认的范围是Singleton.
@Configuration(defaultAutowire = Autowire.BY_TYPE, defaultLazy = Lazy.FALSE)

public class DataSourceConfiguration extends ConfigurationSupport ...{
}