一、定义

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Configuration {    @AliasFor(annotation = Component.class)    String value() default "";}

@Configuration的作用,指定一个或多个@Bean办法,由spring加载和生成bean,相当于xml的root标签。

二、例子

@Configuration public class AppConfig {     @Bean     public MyBean myBean() {         // instantiate, configure and return bean ...     } }

三、如何让spring加载它?

1、通过ApplicationContext加载

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AppConfig.class); ctx.refresh(); MyBean myBean = ctx.getBean(MyBean.class); // use myBean ... 

2、通过xml加载

 <beans>    <context:annotation-config/>    <bean class="com.acme.AppConfig"/> </beans>

3、通过@ComponentScan

@ComponentScan("com.acme.app.services")

待加载的类放到扫描包外面

四、其它用法

1、@Component

  • 被@Configuration注解的类也是一个@Component
  • @Autowired, @Value都能用
 @Configuration public class AppConfig {    @Autowired Environment env;    @Value("${bean.name}") String beanName;    @Bean    public MyBean myBean() {        MyBean myBean = new MyBean();        myBean.setName(env.getProperty("bean.name"));        return myBean;    }}

2、搭配Import

@Configurationpublic class DatabaseConfig {    @Bean    public DataSource dataSource() {        // instantiate, configure and return DataSource    }}@Configuration@Import(DatabaseConfig.class)public class AppConfig {    private final DatabaseConfig dataConfig;    public AppConfig(DatabaseConfig dataConfig) {        this.dataConfig = dataConfig;    }    @Bean    public MyBean myBean() {        // reference the dataSource() bean method        return new MyBean(dataConfig.dataSource());    }}

3、搭配Profile辨别多环境

@Profile("development")@Configurationpublic class EmbeddedDatabaseConfig {    @Bean    public DataSource dataSource() {        // instantiate, configure and return embedded DataSource    }}@Profile("production")@Configurationpublic class ProductionDatabaseConfig {    @Bean    public DataSource dataSource() {        // instantiate, configure and return production DataSource    }}

或者用这种

@Configurationpublic class ProfileDatabaseConfig {    @Bean("dataSource")    @Profile("development")    public DataSource embeddedDatabase() { ... }    @Bean("dataSource")    @Profile("production")    public DataSource productionDatabase() { ... }}

4、加载xml外面的bean

@Configuration@ImportResource("classpath:/com/acme/database-config.xml")public class AppConfig {    @Inject DataSource dataSource; // from XML    @Bean    public MyBean myBean() {        // inject the XML-defined dataSource bean        return new MyBean(this.dataSource);    }}

5、多个嵌套应用

@Configurationpublic class AppConfig {    @Inject DataSource dataSource;    @Bean    public MyBean myBean() {        return new MyBean(dataSource);    }    @Configuration    static class DatabaseConfig {        @Bean        DataSource dataSource() {            return new EmbeddedDatabaseBuilder().build();        }    }}

欢送关注微信公众号:丰极,更多技术学习分享。