@Configuration注解详解

Configuration代码简介

Configuration注释类表明其主要目的是作为bean定义的源;@Configuration类允许通过调用同一类中的其他@Bean方法来定义bean之间的依赖关系

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {String value() default "";
}

一个类声明一个或多个 @Bean方法,并且可以由Spring容器进行处理,以在运行时为这些bean生成bean定义和服务请求,例如:

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

@Configuration 类通使用 AnnotationConfigApplicationContext或具有Web功能的org.springframework.web.context.support.AnnotationConfigWebApplicationContext AnnotationConfigWebApplicationContext进行引导,如下

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

直接在AnnotationConfigApplicationContext上注册 @Configuration类的替代方法,可以在Spring的XML文件中将 @Configuration类声明为普通定义:

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

在上面的示例中,<context:annotation-config/>,启用ConfigurationClassPostProcessor和其他与注解相关的后置处理器,来处理 @Configuration。

@Configuration 用 @Component进行元注释,所以 @Configuration类可以是组件扫描的对象;用Spring XML的 <context:component-scan />,所以也可以像常规 @Component一样利用 @Autowired 或者javax.inject.Inject @Inject。如果存在单个构造函数,则自动装配语义将透明地应用

@Configuration
public class AppConfig {private final SomeBean someBean;public AppConfig(SomeBean someBean) {this.someBean = someBean;}// @Bean definition using "SomeBean"
}
@Configuration技巧
  • 可以通过将Spring的org.springframework.core.env.Environment注入@Configuration类中需要的外部环境值;例如,使用 @Autowired 注解即可:
@Configuration
public class AppConfig {@Autowired Environment env;@Beanpublic MyBean myBean() {MyBean myBean = new MyBean();myBean.setName(env.getProperty("bean.name"));return myBean;}
}
  • Environment解析的属性驻留在一个或多个“属性源”对象, @Configuration 可以使用 org.springframework.core.env.PropertySources @PropertySources注解:
@Configuration
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {@Inject Environment env;@Beanpublic MyBean myBean() {return new MyBean(env.getProperty("bean.name"));}
}
  • 可以使用@Value将外部化的值连接到 @Configuration类中
@Configuration
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {@Value("${bean.name}") String beanName;@Beanpublic MyBean myBean() {return new MyBean(beanName);}}

当使用Spring的 org.springframework.context.support.PropertySourcesPlaceholderConfigurer
PropertySourcesPlaceholderConfigurer, 通常用<context:property-placeholder />的XML开启。

  • @Configuration 类可以使用@Import注解组成,与 在Spring XML中的工作方式不同。 @Configuration 对象作为容器内的Spring bean管理,所以导入的配置可以按普通的方式注入(例如,通过构造函数注入):
@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());}
}

所以可以通过仅针对Spring上下文注册 AppConfig来引导AppConfig和导入的 DatabaseConfig

new AnnotationConfigApplicationContext(AppConfig.class);

@Configuration 类可以用 @Profile注解进行标记,以指示仅当给定的一个或多个配置文件为 active时才应对其进行处理

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

另外,也可以在 @Bean方法级别,例如 声明配置文件条件。对于同一配置类中的替代bean变体:

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

如上所述,在XML文件中,可以将 @Configuratio}类声明为常规Spring 定义。也可以使用 @ImportResource注解将Spring XML配置文件导入到@Configuration类中。从XML导入的Bean定义可以按通常的方式注入(例如,使用Inject注解)

@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);}
}
  • @Configuration类可以相互嵌套,如下所示:
@Configuration
public class AppConfig {@Inject DataSource dataSource;@Beanpublic MyBean myBean() {return new MyBean(dataSource);}@Configurationstatic class DatabaseConfig {@BeanDataSource dataSource() {return new EmbeddedDatabaseBuilder().build();}}
}

当这样引导时,仅需要针对应用程序上下文注册AppConfig。由于是嵌套的 @Configuration, DatabaseConfig 将自动注册。 AppConfig.DatabaseConfig之间的关系已经隐式清除时,避免了使用 @Import注释。注意,嵌套的@Configuration类可以与@Profile注解一起使用,以为封闭的 @Configuration提供同一bean的两个选项。默认情况下,@Bean方法将在容器引导时被实例化。为了避免这种情况,可以将 @Configuration与 @Lazy注解结合使用,以指示默认情况下默认初始化了类中声明的所有 @Bean方法。@Lazy 也可以在单独的 @Bean方法上使用。

  • spring-test模块中的Spring的TestContext框架提供了 @ContextConfiguration注解,从Spring 3.1开始,该注解可以接受 @Configuration的数组类对象:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={AppConfig.class, DatabaseConfig.class})
public class MyTests {@Autowired MyBean myBean;@Autowired DataSource dataSource;@Testpublic void test() {// assertions against myBean ...}
}

使用 @Enable注解启用内置的Spring功能,比如异步方法执行,定时任务执行,注释驱动的事务管理和SpringMVC类的Spring功能都可以启用和通过@Configuration类进行配置使用各自的“ @Enable”注释。
比如

org.springframework.scheduling.annotation.EnableAsync,@EnableAsync
org.springframework.scheduling.annotation.EnableScheduling @EnableScheduling,
org.springframework.transaction.annotation.EnableTransactionManagement @EnableTransactionManagement
org.springframework.context.annotation.EnableAspectJAutoProxy @EnableAspectJAutoProxy,
rg.springframework.web.servlet.config.annotation.EnableWebMvc @EnableWebMvc

@Configuration的约束
  1. Configuration类必须作为类提供(即不作为从工厂方法返回的实例),以允许通过生成的子类增强运行时
  2. 配置类必须不是final。
  3. 配置类必须是非本地的(即,不能在方法中声明)。
  4. 任何嵌套的配置类都必须声明为static。
  5. @Bean 方法不会再创建其他配置类(任何此类实例都将被视为常规Bean,其配置注释不会被检测到)。

@Configuration注解详解相关推荐

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

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

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

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

  3. mybatis注解详解

    mybatis注解详解 首 先当然得下载mybatis-3.0.5.jar和mybatis-spring-1.0.1.jar两个JAR包,并放在WEB-INF的lib目录下 (如果你使用maven,则 ...

  4. spring-boot注解详解(一)

    spring-boot注解详解(一) @SpringBootApplication @SpringBootApplication = (默认属性)@Configuration + @EnableAut ...

  5. Spring Boot注解详解

    文章目录 使用注解的优势 注解详解(配备了完善的释义) 注解列表如下 JPA注解 springMVC相关注解 全局异常处理 项目中具体配置解析和使用环境 使用注解的优势 采用纯java代码,不在需要配 ...

  6. 【SpringBoot 】SpringBoot注解详解

    [SpringBoot ]SpringBoot注解详解 一.注解(annotations)列表  @SpringBootApplication:包含了@ComponentScan.@Configura ...

  7. @Profile注解详解

    @Profile注解详解 @Profile: Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能: 开发环境develop.测试环境test.生产环境master 数据源:(/ ...

  8. spring注解详解与用法(总览)

    这篇文章收集了我写的所有的spring注解的详细说明与用法,点击可以跳转到对应文章,此文章会不断更新 spring注解详解与用法(1)最基础也是最常见的如下所示,详情点击这里 @Controller/ ...

  9. SpringBoot定时任务@Scheduled注解详解

    SpringBoot定时任务@Scheduled注解详解 项目开发中,经常会遇到定时任务的场景,Spring提供了@Scheduled注解,方便进行定时任务的开发 概述 要使用@Scheduled注解 ...

最新文章

  1. AttributeError: 'dict' object has no attribute 'status_code'
  2. 百练 2973 Skew数 解题报告
  3. 微软私有云Azure Pack实践系列之三创建虚拟机角色
  4. Pod详解-生命周期-容器探测
  5. Java的新项目学成在线笔记-day9(七)
  6. 什么是决定计算机内部寄存器,问题解答之 计算机中寄存器定义,分类
  7. 20191015:基数排序法
  8. 低代码大势所趋,RDP报表3.0应运而生
  9. 系统报.NET Framework 3.5缺失无法安装问题解决方案
  10. 程序员 文本编辑器 c语言,程序员必备的五款文本编辑器
  11. 数字孪生 工业互联网 IIoT 解决方案
  12. 简单教会按关键字搜索商品
  13. python数据可视化学习之随机漫步
  14. Android怎么在Service中执行耗时操作
  15. EF + EFCore 学习
  16. WPF实现拍照截图功能(WPFMediaKit 调用摄像头和拍照)
  17. 浅谈偏光镜使用与选购[机器视觉系列]
  18. 导入mdf文件的两种方法
  19. Linux摄像头UVC驱动第五篇--启动传输之设置摄像头参数
  20. mysql中dateformat用法,MySQL date_format()函数

热门文章

  1. Tencent是什么意思?腾讯?
  2. 北京龙泉寺:最强科研组织!清华北大学子排队出家,门禁都是指纹识别的
  3. spring-session整合redis原理 排查失效原因
  4. 计算机毕业设计之选题大全,含java,PHP,springboot,python,小程序等
  5. 看完《寻梦环游记》,我抓爬了700多条影评
  6. Python字符串类型及格式化
  7. 解析java中的方法重写
  8. WebGL实现LED电子广告牌字幕上下左右移动特效
  9. python十六进制转八进制
  10. python scrapy 环境搭建_Python Scrapy 爬虫(一):环境搭建