@Configuration注解标识的类中声明了1个或者多个@Bean方法,Spring容器可以使用这些方法来注入Bean,比如:

@Configuration
public class AppConfig {//这个方法就向Spring容器注入了一个类型是MyBean名字是myBean的Bean@Beanpublic MyBean myBean() {// instantiate, configure and return bean ...}
}

@Configuration类一般是由AnnotationConfigApplicationContext或者它的web变种AnnotationConfigWebApplicationContext来处理的,比如:

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

也可以用以XML方式引入,就跟引入普通的Bean是一样的:

<beans><context:annotation-config/><!--也可以这样加载configuration类--><bean class="com.acme.AppConfig"/>
</beans>

上例中,为了启用ConfigurationClassPostProcessor和其他的注解相关的Post Processor来处理@Configuration,需要添加<context:annotation-config/>。

组件扫描的方式使用

@Configuration上面添加了@Component元注解,因此, @Configuration是支持组件扫描的(一般要添加<context:component-scan/> ) ,它跟其他普通的Component一样也支持@Autowired/@Inject,如果@Configuration的类有一个构造函数,也支持构造函数自动注入,比如:

@Configuration
public class AppConfig {private final SomeBean someBean;//构造函数注入public AppConfig(SomeBean someBean) {this.someBean = someBean;}//注入另一个bean@Autowiredprivate AnotherBean1 anotherBean1;//注入另一个bean@Resourceprivate AnotherBean2 anotherBean2;// @Bean definition using "SomeBean"
}

@Configuration 类不仅可以被扫描到,它自己也可以配置@ComponentScan注解去做组件扫描。

@Configuration
//做组件扫描
@ComponentScan("com.acme.app.services")
public class AppConfig {// various @Bean definitions ...
}

在@Configuration中使用property

使用Environment获取property

可以把org.springframework.core.env.Environment注入到@Configuration里面来获取property值,比如可以使用@Autowired注入:

@Configuration
public class AppConfig {//注入Environment @Autowired Environment env;@Beanpublic MyBean myBean() {MyBean myBean = new MyBean();myBean.setName(env.getProperty("bean.name"));return myBean;}
}

通过Environment获取的property可以存在于多个"property source" 对象中,@Configuration类本身也可以使用@PropertySource来提供"property source":

@Configuration
//引入property文件
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {@Inject Environment env;@Beanpublic MyBean myBean() {return new MyBean(env.getProperty("bean.name"));}
}

使用@Value注解获取property

@Configuration
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {@Value("${bean.name}") String beanName;@Beanpublic MyBean myBean() {return new MyBean(beanName);}
}

这种方式经常和PropertySourcesPlaceholderConfigurer一起使用,PropertySourcesPlaceholderConfigurer可以通过配置<context:property-placeholder/>来自动启用,也可以在@Configuration类中用@Bean明确来启用。

注意,只有当你需要自定义占位符等场景才需要用@Bean来注册PropertySourcesPlaceholderConfigurer,如果ApplicationContext中没有明确注册PropertySourcesPlaceholderConfigurer,Spring容器会在Environment中自动注册一个默认的property解析器。

使用@EnableConfigurationProperties

这种方式可以引入@ConfigurationProperties标识的注解类,比如:

@org.springframework.context.annotation.Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnBean(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {...
}
@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)
public class MybatisProperties {...
}

组合@Configuration类

使用@Import注解

可以使用@Import注解组合多个@Configuration类,就跟在xml中使用 <import>引入别的配置文件一样。因为@Configuration对象是被Spring容器当成Bean来管理的,被引入的Configuration类也可以被容器管理和注入,比如可以用构造函数注入的方式:

//这是一个@Configuration类
@Configuration
public class DatabaseConfig {@Beanpublic 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;}@Beanpublic MyBean myBean() {// reference the dataSource() bean methodreturn new MyBean(dataConfig.dataSource());}
}

现在只需要在容器中注册AppConfig就可以同时注册AppConfig和DatabaseConfig了,比如:

new AnnotationConfigApplicationContext(AppConfig.class);

使用@Profile注解

@Configuration可以跟@Profile一起使用,说明只有在给定的profile下@Configuration 才能生效:

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

此外还可以在@Bean 方法级别上设置profile,比如:

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

使用@ImportResource注解引入Spring的xml配置

@Configuration类可以在xml中像普通的bean那样定义,同时也可以在@Configuration类中使用@ImportResource引入xml配置文件,被引入的xml中定义的bean也可以被注入,比如:

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

虽然可以,但是不推荐,相当于是一种兼容xml的做法。

嵌套的@Configuration类

@Configuration类可以内嵌在别的@Configuration类当中(比如mybatis-spring-boot-starter的MybatisAutoConfiguration):

@Configuration
public class AppConfig {@Inject DataSource dataSource;@Beanpublic MyBean myBean() {return new MyBean(dataSource);}@Configurationstatic class DatabaseConfig {@BeanDataSource dataSource() {return new EmbeddedDatabaseBuilder().build();}}
}

只需要注册AppConfig就可以同时把AppConfig和DatabaseConfig一块注入到容器中,内嵌的DatabaseConfig会被自动注册,这种方式就避免了使用@Import。

注意这种内嵌的@Configuration类的方式也可以和 @Profile一起使用来提供同一个bean的多种实现。

配置延迟初始化

默认情况下,@Bean方法是在容器启动时立即加载的,@Configuration可以和@Lazy一起使用,表明所有的@Bean 方法都是延迟初始化的,当然@Lazy也可以标注在单个@Bean方法上。

@Configuration类如何做测试

Spring的Test框架提供了@ContextConfiguration注解,他可以接受

// @Configuration类:
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {AppConfig.class, DatabaseConfig.class})
public class MyTests {@Autowired MyBean myBean;@Autowired DataSource dataSource;@Testpublic void test() {// assertions against myBean ...}
}

使用@Enable启用Spring的内置的特性

Spring的一些特性比如异步方法调用、任务调度、注解驱动的事务管理、甚至是SpringMVC都可以通过配置@Configuration来启用,详细信息可以参考@EnableAsync, @EnableScheduling, @EnableTransactionManagement, @EnableAspectJAutoProxy @EnableWebMvc。

@Configuration类的一些限制

  1. @Configuration类必须是class,不能是工厂方法返回的实例,允许运行时增强。
  2. @Configuration类一定不能是final的。
  3. @Configuration类一定不能是local的(不能在方法内部定义)
  4. @Configuration类的内嵌的配置类必须是static的。
  5. @Bean方法不能创建配置类,@Bean方法定义的bean只是普通的Bean,即使有@Configuration注解也不会被容器使用。

以上内容翻译自@Configuration的Javadoc文档。

扫一扫关注微信公众号:

v2-85727c0e862868e8ccbf40348b28946e_b.jpg

@configuration注解_SpringBoot的@Configuration扫盲相关推荐

  1. Spring零配置之@Configuration注解详解

    转载自 Spring零配置之@Configuration注解详解 @Configuration介绍 Spring3.0之前要使用Spring必须要有一个xml配置文件,这也是Spring的核心文件,而 ...

  2. @Configuration注解详解

    @Configuration注解详解 Configuration代码简介 Configuration注释类表明其主要目的是作为bean定义的源:@Configuration类允许通过调用同一类中的其他@B ...

  3. @Configuration注解使用

    1.前言 @Configuration是Spring的注解,不是SpringBoot的!早在Spring框架的时候就有使用,但是由于那个时候配置文件还是比较流行,因此@Configuration注解并 ...

  4. @Configuration注解

    1.作用 @Configuration注解的作用:声明一个类为配置类,用于取代bean.xml配置文件注册bean对象. 2.基础运用 @Configuration注解最常见的搭配使用有两个:@Bea ...

  5. SpringBoot复习:2(@Configuration注解)

    @Configuration注解 @Configuration注解的作用是代替以前我们使用的xml配置文件,被注解的类就是配置类,其内部包含有一个或多个被@Bean注解的方法,这些方法将会被Annot ...

  6. SpringBoot学习之@Configuration注解和@Bean注解

    @Configuration 1.@Configuration注解底层是含有@Component ,所以@Configuration 具有和 @Component 的作用. 2.@Configurat ...

  7. Spring @Configuration注解及配置方法

    1.作用 Spring3.0开始,@Configuration用于定义配置类,定义的配置类可以替换xml文件,一般和@Bean注解联合使用 @Configuration注解主要标注在某个类上,相当于x ...

  8. [转]Spring注解-@Configuration注解、@Bean注解以及配置自动扫描、bean作用域

    1.@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文) package com.test.s ...

  9. Spring零配置之@Configuration注解详解。

    @Configuration介绍 Spring3.0之前要使用Spring必须要有一个xml配置文件,这也是Spring的核心文件,而Spring3.0之后可以不要配置文件了,通过注解@Configu ...

最新文章

  1. ArduinoYun教程之配置Arduino Yun环境
  2. c语言程序设计网课作业答案,《C语言程序设计》作业答案
  3. 2019蓝桥杯省赛---java---B---4(数的分解)
  4. matlab车辆测距,一种基于单目视觉的车辆测距方法
  5. 数据结构实验之栈二:一般算术表达式转换成后缀式
  6. postgre管理员 无法访问表_postgresql – 授予用户对所有表的访问权限
  7. 8月9日发布!华为EMUI 10将在华为开发者大会上登场
  8. (25):Silverlight 2 综合实例之Live Search
  9. 开源软件清除了“开源”和“商业”之间的障碍——商业软件、开源软件和自由软件的区别
  10. 读书-高性能MySQL 第三章
  11. @synthesize@dynamic@private,@protected,@publicassign、weak、strong、retain、copy、nonatomic、atomic
  12. win10单机修复计算机在哪,win10如何进入高级修复选项
  13. 各种进制转换(二,八,十,十六进制间转换)详解附代码
  14. 计算机无法找到扫描仪和照相机,我的电脑不显示扫描仪和摄像头的原因及解决方法...
  15. linux can命令详解,Linux CAN编程详解
  16. 英汉互译教程---生词
  17. 学习累了休息一下——————看完不笑你厉害
  18. OFD文档标准 2.主入口文档
  19. 区划代码和城乡划分代码
  20. 20150420-20150424 一周工作问题及解决【共享文件的获取、前后台乱码问题解决等】

热门文章

  1. linux pdf 合并 脚本,Ubuntu中使用pdftk合并、分离PDF文档等操作
  2. vector的初始化_C++的vector使用方法
  3. CSDN芒果独家原创YOLOv5改进、YOLOv7改进(适用YOLOv8改进)专栏 | 《芒果YOLO改进系列进阶指南》来自人工智能专家唐宇迪老师联袂推荐
  4. we learn考试能切屏吗_高中英语听力答题技巧,你真的会吗?从此刻开始练习!...
  5. 坐标系转换相关基本理论
  6. IIS发布.bak文件,mime类型为是什么?
  7. 百度统计getData接口8002错误的坑
  8. 从创业场转战资本市场,窥探投资人郭宇航眼中的金融科技“红利”
  9. 转CSDN报道:一家中国报表公司的酸甜苦辣
  10. pads9.5创建电源符号