在最近的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  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;  }  }
@Configuration注释标识这个对象作为一个特殊配置类,每一个@Bean方法定义了一个bean.bean的名字是方法的名字,它也可以用注释来定义而外的名字.但是最好从方法中选择名字,而不是注释中,这就像编译器能够确保其唯一性一样. Beans在Java代码中配置,使用构造器,属性或者任意的方法调用,我们注意到调用另外一个bean方法建立了一个从”book” bean到”rod” bean的依赖.但是在Java的实例对象中没有框架的支持有一个主要的优点:例如: 每个@Bean是Spring组件并能利用所有的Spring服务,例如声明事务管理. 每个public @Bean方法被增加到Spring容器中,因此注入到其他对象,JMX导出和其他定义中是可以的. 在现存的Spring环境中是适合的. 通过比较XML定义来完成同样的结果是更容易的,就象下面这样:
 <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>
虽然这是基于Java注释的,Java配置机制在注释的使用上是唯一的,注释并没有包含在核心的业务逻辑中,而是在每个独立的配置类中.对配置来说,这是DSL,因此,它保留了Spring的非侵入允诺.,你可以不必改变Java代码来使用. 这个配置类,类似与一个XML bean定义文件,并且这样的@Configuration注释包含一些对<bean>元素相似的选项,像默认的延迟初始化,例如:
 @Configuration(defaultAutowire = Autowire.BY_TYPE, defaultLazy = Lazy.FALSE)  public class DataSourceConfiguration extends ConfigurationSupport { }
@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.
|