@configuration注解_SpringBoot的@Configuration扫盲
@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类的一些限制
- @Configuration类必须是class,不能是工厂方法返回的实例,允许运行时增强。
- @Configuration类一定不能是final的。
- @Configuration类一定不能是local的(不能在方法内部定义)
- @Configuration类的内嵌的配置类必须是static的。
- @Bean方法不能创建配置类,@Bean方法定义的bean只是普通的Bean,即使有@Configuration注解也不会被容器使用。
以上内容翻译自@Configuration的Javadoc文档。
扫一扫关注微信公众号:
@configuration注解_SpringBoot的@Configuration扫盲相关推荐
- Spring零配置之@Configuration注解详解
转载自 Spring零配置之@Configuration注解详解 @Configuration介绍 Spring3.0之前要使用Spring必须要有一个xml配置文件,这也是Spring的核心文件,而 ...
- @Configuration注解详解
@Configuration注解详解 Configuration代码简介 Configuration注释类表明其主要目的是作为bean定义的源:@Configuration类允许通过调用同一类中的其他@B ...
- @Configuration注解使用
1.前言 @Configuration是Spring的注解,不是SpringBoot的!早在Spring框架的时候就有使用,但是由于那个时候配置文件还是比较流行,因此@Configuration注解并 ...
- @Configuration注解
1.作用 @Configuration注解的作用:声明一个类为配置类,用于取代bean.xml配置文件注册bean对象. 2.基础运用 @Configuration注解最常见的搭配使用有两个:@Bea ...
- SpringBoot复习:2(@Configuration注解)
@Configuration注解 @Configuration注解的作用是代替以前我们使用的xml配置文件,被注解的类就是配置类,其内部包含有一个或多个被@Bean注解的方法,这些方法将会被Annot ...
- SpringBoot学习之@Configuration注解和@Bean注解
@Configuration 1.@Configuration注解底层是含有@Component ,所以@Configuration 具有和 @Component 的作用. 2.@Configurat ...
- Spring @Configuration注解及配置方法
1.作用 Spring3.0开始,@Configuration用于定义配置类,定义的配置类可以替换xml文件,一般和@Bean注解联合使用 @Configuration注解主要标注在某个类上,相当于x ...
- [转]Spring注解-@Configuration注解、@Bean注解以及配置自动扫描、bean作用域
1.@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文) package com.test.s ...
- Spring零配置之@Configuration注解详解。
@Configuration介绍 Spring3.0之前要使用Spring必须要有一个xml配置文件,这也是Spring的核心文件,而Spring3.0之后可以不要配置文件了,通过注解@Configu ...
最新文章
- ArduinoYun教程之配置Arduino Yun环境
- c语言程序设计网课作业答案,《C语言程序设计》作业答案
- 2019蓝桥杯省赛---java---B---4(数的分解)
- matlab车辆测距,一种基于单目视觉的车辆测距方法
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- postgre管理员 无法访问表_postgresql – 授予用户对所有表的访问权限
- 8月9日发布!华为EMUI 10将在华为开发者大会上登场
- (25):Silverlight 2 综合实例之Live Search
- 开源软件清除了“开源”和“商业”之间的障碍——商业软件、开源软件和自由软件的区别
- 读书-高性能MySQL 第三章
- @synthesize@dynamic@private,@protected,@publicassign、weak、strong、retain、copy、nonatomic、atomic
- win10单机修复计算机在哪,win10如何进入高级修复选项
- 各种进制转换(二,八,十,十六进制间转换)详解附代码
- 计算机无法找到扫描仪和照相机,我的电脑不显示扫描仪和摄像头的原因及解决方法...
- linux can命令详解,Linux CAN编程详解
- 英汉互译教程---生词
- 学习累了休息一下——————看完不笑你厉害
- OFD文档标准 2.主入口文档
- 区划代码和城乡划分代码
- 20150420-20150424 一周工作问题及解决【共享文件的获取、前后台乱码问题解决等】
热门文章
- linux pdf 合并 脚本,Ubuntu中使用pdftk合并、分离PDF文档等操作
- vector的初始化_C++的vector使用方法
- CSDN芒果独家原创YOLOv5改进、YOLOv7改进(适用YOLOv8改进)专栏 | 《芒果YOLO改进系列进阶指南》来自人工智能专家唐宇迪老师联袂推荐
- we learn考试能切屏吗_高中英语听力答题技巧,你真的会吗?从此刻开始练习!...
- 坐标系转换相关基本理论
- IIS发布.bak文件,mime类型为是什么?
- 百度统计getData接口8002错误的坑
- 从创业场转战资本市场,窥探投资人郭宇航眼中的金融科技“红利”
- 转CSDN报道:一家中国报表公司的酸甜苦辣
- pads9.5创建电源符号