@Configuration这是一个类级注解。如下所示,被它注解的类可能包含多个被@Bean注解的方法。Spring容器会调用这些方法,获得你初始化后的对象实例,并把他们注册为容器内的beans。package spring.example@Configurationpublic class MyAppConfig { @bean public SomeBean someBean() { // 实例化并返回,也可进行初始化 return new SomeBeanImpl(); }}同等作用的XML配置会像下面这样:<bean name=“someBean” class=“spring.example.SomeBeanImpl”/>@Configuration类们实际上就是Spring管理的用于创建并注册bean实例的工厂。Spring容器的启动在Java-based的配置方式下,spring容器可以被AnnotationConfigApplicationContext启动,或者,针对Web应用AnnotationConfigWebApplicationContext也行。new AnnotationConfigApplicationContext(MyAppConfig.class);我们也可以指定包含了@Configuration类的有效包名:new AnnotationConfigApplicationContext(“spring.example”);基于上述两个重载方法,我们可以在单个package下放进多个JavaConfig类。使用多个JavaConfig类new AnnotationConfigApplicationContext( AppConfig.class, DataSourceConfig.class );new AnnotationConfigApplicationContext(“example.spring.app”,“example.spring.datasource”);配置类中的依赖注入既然配置类会被Spring容器注册成beans,那意味着,我们可以像使用普通bean那样使用这个配置bean。在以下例子我们要把这个一个配置bean注入给另一个配置bean:@Configurationpublic class AppConfig { // 方式一:注入DataSourceConfig @Autowired private DataSourceConfig dataSourceConfig; @Bean Client clientBean() { return new Client(dataSourceConfig.dataSourceBean()); } public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class, DataSourceConfig.class); context.getBean(Client.class).showData(); } // 方式二:为何要那么麻烦呢?直接注入DataSourceBean不就好了? @Autowired private DataSourceBean dataSourceBean; @Bean Client clientBean() { return new Client(dataSourceBean); }}@Configurationclass DataSourceConfig { @Bean DataSourceBean dataSourceBean() { return new DataSourceBean(); }}class Client { private DataSourceBean dataSourceBean; Client(DataSourceBean dataSourceBean){ this.dataSourceBean = dataSourceBean; } public void showData() { System.out.println(dataSourceBean.getData()); }}class DataSourceBean { public String getData() { return “some data”; }}