@Configuration注解使用详解【记录】

@Configuration注解

1、主要作用:

  • 标识配置类:@Configuration用于标识一个类是配置类,这是Spring Boot应用程序中的关键组件之一,用于定义和管理Bean的创建和配置(用于取代bean.xml配置文件注册bean对象)。通过使用@Configuration注解,我们告诉Spring容器这个类是一个配置类,并且应当被加载和处理。

  • 定义Bean:配置类通常包含一些用于创建和配置Bean的方法。这些方法使用@Bean注解来定义Bean,并且在Spring容器启动时被调用。通过@Configuration注解,我们可以将这些方法标识为Bean定义方法,使它们成为Spring应用程序上下文中的Bean。

  • 提供配置属性:配置类还可以使用@ConfigurationProperties注解提供应用程序的配置属性。@ConfigurationProperties注解允许我们将配置属性绑定到配置文件中的值,从而实现应用程序的配置管理。通过在配置类中使用@ConfigurationProperties注解,我们可以轻松地将配置属性注入到我们的应用程序中。

  • 条件化配置:配置类中的方法可以使用条件注解(如@ConditionalOnClass@ConditionalOnProperty等)来根据条件创建和注册Bean。这使得可以根据应用程序的环境条件来选择性地配置Bean。

  • 集中管理和组织配置信息:通过@Configuration注解可以将这些配置集中到一个或多个配置类中,方便开发和维护应用程序。

2、使用约束:

  • @Configuration注解作用在类、接口(包含注解)上;
  • @Configuration用于定义配置类,可替换XML配置文件,相当于XML形式的Spring配置;
  • @Configuration注解类中可以声明一个或多个 @Bean 注解的方法;
  • @Configuration注解作用的类不能是 final 类型;
  • @Configuration不可以是匿名类;
  • 嵌套的@Configuration类必须是 static 的。

3、使用示例1,标识配置类和定义bean:

@Configuration注解是Spring框架中的一个核心注解,用于标识一个类作为配置类,该类中可以定义Bean。当Spring容器启动时,它会扫描这些带有 @Configuration 注解的类,并将它们作为配置信息来处理。

这些配置类通常包含一个或多个带有 @Bean 注解的方法。@Bean 注解告诉Spring容器,方法返回的对象应该被注册为Spring应用上下文中的Bean,即被Spring管理的一个对象。

@Configuration
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}
}

在这个例子中,AppConfig 类通过 @Configuration 注解标识为配置类,而 myBean 方法被 @Bean 注解标识,表明它将返回一个对象,该对象需要被注册到Spring的IoC容器中。当应用启动时,Spring容器会创建一个 MyBean 的实例,并将其作为Bean管理。

在例子中使用 @Configuration 注解的 AppConfig 类也会被Spring的IoC(控制反转)容器管理。当Spring应用上下文启动时,它会扫描并注册所有带有 @Configuration 注解的类作为配置类的Bean。这意味着,AppConfig 自身也是一个Bean,它会被注入到IoC容器中。

这允许在其他Bean中通过依赖注入的方式使用 AppConfig,尽管这在实际应用中不是很常见。通常,@Configuration 注解修饰的类被用来声明Bean和配置应用上下文,而不是作为被注入的服务。

综上所述,@Configuration 类在Spring中既充当配置信息的角色,又作为容器中的一个Bean存在,其作用是提供一个灵活且强大的方式来定义和组装Spring Bean,使得Spring的配置更加灵活和方便。

补充:@Configuration注解最常见的搭配使用有两个:@Bean@Scope

  • @Bean:等价于Spring中的bean标签用于注册bean对象的,给容器中添加组件,一般以方法名作为组件的id,配置类里面使用@Bean标注在方法上给容器注册组件,默认是单实例的。
@Configuration(proxyBeanMethods = true) //告诉springboot这是一个配置类 == 配置文件
public class Myconfig {@Bean//给容器中添加组件,以方法名作为组件的id。// 返回类型为组件类型,返回的值,就是组件在容器中的实例public User user01(){User wangcai = new User("wangcai",23);//user组件依赖了pet组件wangcai.setPet(pet01());return wangcai;}@Beanpublic Pet pet01(){return new Pet("旺财");}
}
  • @Scope:用于声明该bean的作用域,作用域有singleton、prototype、request、session。
@Configuration
public class MyConfig {@Bean("user")@Scope(SCOPE_PROTOTYPE)         //多例public User getUser(){System.out.println("User对象进行创建!");return new User("用户", 22, getDog());}@Bean("dog")@Scope(SCOPE_SINGLETON)         //单例public Dog getDog(){System.out.println("Dog对象进行创建!");return new Dog("金毛", 3);}
}

思考:那如何获取AppConfig中的MyBean?

在Spring框架中,获取 AppConfig 中定义的 MyBean 实例通常通过依赖注入(DI)来实现。这可以通过多种方式完成,包括构造函数注入、设置(setter)注入或字段注入。以下是一些示例:

1. 构造函数注入

@Component
public class SomeService {private MyBean myBean;@Autowiredpublic SomeService(MyBean myBean) {this.myBean = myBean;}// 使用myBean
}

2. 设置(Setter)注入

@Component
public class SomeService {private MyBean myBean;@Autowiredpublic void setMyBean(MyBean myBean) {this.myBean = myBean;}// 使用myBean
}

3. 字段注入

在下面例子中,@Component 注解用于标记 SomeService 类,使其成为Spring管理的一个Bean。@Autowired 注解用于自动注入依赖,即告诉Spring框架应自动注入 MyBean 的实例。

@Component
public class SomeService {@Autowiredprivate MyBean myBean;// 使用myBean
}

4. 通过 ApplicationContext 获取

还可以通过编程方式直接从 ApplicationContext 获取 MyBean 实例:

public class SomeClass {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);MyBean myBean = context.getBean(MyBean.class);// 使用myBean}
}

最后一个示例演示了如何在非Spring管理的对象中获取 MyBean 实例。通过手动创建 ApplicationContext 并从中检索Bean,可以在任何地方获取 MyBean 的实例,但这种方法违背了依赖注入的原则,通常仅在特定场景下使用,如在应用的入口点或配置类中。

4、使用示例2,提供配置属性:

在Spring Boot应用程序中,@Configuration@ConfigurationProperties(prefix = "")是两个用于配置和管理应用程序设置的常用注解,它们扮演着不同但互补的角色。

  • @ConfigurationProperties注解:用于将配置文件中的属性绑定到一个POJO(Plain Old Java Object)上。通过指定prefix属性,可以将配置文件中特定前缀的属性绑定到同名的POJO属性上。这种方式简化了配置管理,使得配置数据的组织和使用变得更加方便。

注意:当你在类上使用 @ConfigurationProperties 注解时,你通常希望SpringBoot能够自动绑定配置文件中的属性到该类的字段上。然而,仅仅使用 @ConfigurationProperties 注解并不足以让SpringBoot自动配置这些属性;你还需要指示SpringBoot去寻找这些配置类并将其注册为Spring容器中的bean,通常在配置类上使用@EnableConfigurationProperties注解或直接在@ConfigurationProperties类上声明一个Spring组件注解(如 @Component@Configuration等)。

用法一:

通过@Component@ConfigurationProperties(prefix = "")注解组合声明配置类

redis:database: 1host: redis-xxxxxxxxxx-proxy-nlb.xxxxx-xxxx-xx.xxxxx.comport: 6379password: xxxxxxtimeout: 2000

在RedisConfiguration类中,将yaml配置中的属性注入到RedisConfiguration配置类中。

@Component
@ConfigurationProperties(prefix = "redis")
public class RedisConfiguration {private String database;private String host;private Integer port;private String password;// 其它属性...// getters 和 setters
}

在DemoImpl类中,直接可以注入RedisConfiguration通过获取属性的方式获取配置文件中的配置。

@Service
public class DemoImpl implements Demo() {@Autowiredprivate RedisConfiguration redisConfiguration;@Override()public void demo() {String host = redisConfiguration.getHost();System.out.println(host);}
}

用法二:

使用@EnableConfigurationProperties注解激活和注册对应的配置类到IOC容器中。

aces:token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxpath: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

首先将aces配置文件中的属性注入到AcesConfigurationProperties类中,这里无需通过@Component注解将AcesConfigurationProperties 注入IOC容器。

@Data
@ConfigurationProperties(prefix = "aces")
public class AcesConfigurationProperties {private String token;private String path;
}

在AcesConfiguration配置类中使用@EnableConfigurationProperties({AcesConfigurationProperties.class})注解来激活和注册 AcesConfigurationProperties类作为Spring管理的Bean。这一步确保了Spring容器会自动绑定配置文件中的属性到 AcesConfigurationProperties类的字段上。

@Configuration
@EnableConfigurationProperties({AcesConfigurationProperties.class})
public class AcesConfiguration {@Autowiredprivate AcesConfigurationProperties acesConfigurationProperties;@Bean("tdeClient")public TdeClient tdeClient(){TdeClient tdeClientBean = new TdeClient();TdeClient.setToken(acesConfigurationProperties.getToken());TdeClient.setPath(acesConfigurationProperties.getPath());return tdeClient;}
}
@Service
public class DemoImpl implements Demo() {@Autowiredprivate TdeClient tdeClient;@Override()public void demo() {String token= tdeClient.token();System.out.println(token);}
}

结合使用@Configuration@ConfigurationProperties可以提供一种强大的机制来管理应用程序配置,使得配置数据既易于组织,也便于访问和使用。

@Configuration注解在Spring和Spring boot中有什么区别?

在Spring和SpringBoot中,@Configuration 注解的核心功能是相同的:都用来标识配置类,并允许你在这些类中定义Bean。但是,SpringBoot对这个注解提供了一些额外的处理,使得它在SpringBoot应用中的行为与传统的Spring应用略有不同。

1、Spring中的@Configuration

在Spring框架中,@Configuration注解指示一个类包含一个或多个@Bean定义,这些定义将由Spring容器管理。你需要使用@ComponentScan来指定应当扫描哪些包来发现Bean,并使用@Import来引入其他配置类,或者使用<import>标签在XML配置中做到这一点。

2、Spring Boot中的@Configuration

SpringBoot继承了Spring的这些特性,并添加了自动配置的概念。SpringBoot的@SpringBootApplication注解是一个组合注解,它包括了@Configuration@EnableAutoConfiguration@ComponentScan。因此,在SpringBoot应用中,你通常不需要显式地标记@Configuration,除非你要创建额外的配置类。

@EnableAutoConfiguration告诉SpringBoot根据类路径下的jar包依赖、定义的Bean和各种属性设置自动配置应用。这意味着SpringBoot会尝试智能地猜测你需要哪些功能,并自动配置它们。这大大简化了配置过程,因为许多库和功能的默认设置会在没有任何明确配置的情况下自动设置。

3、总结:

  • @Configuration 在Spring和SpringBoot中的基本作用是一样的:它用于定义配置类;
  • SpringBoot提供了额外的自动配置特性,允许更快速地设置和启动项目;
  • 在SpringBoot中,通常不需要显式的@Configuration声明,除非你要定义额外的配置类;
  • SpringBoot中的@SpringBootApplication组合注解已经包含了@Configuration,以及其他用于自动配置的注解。

因此,在使用SpringBoot时,通常会体验到更加“约定大于配置”的开发流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio 与 Gradle 及插件版本兼容性

Android Studio 开始新项目时&#xff0c;会自动创建其中部分文件&#xff0c;并为其填充合理的默认值。 项目文件结构布局&#xff1a; 一、Android Gradle 及插件作用&#xff1a; Android Studio 构建系统以 Gradle 为基础&#xff0c;并且 Android Gradle 插件 (AGP) 添加…

代码随想录阅读笔记-动态规划【不同路径 II】

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为“Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为“Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到右…

全球视频会议软件巨头Zoom,率先引入后量子端到端加密

5月21日&#xff0c;Zoom Video Communications公司宣布&#xff0c;后量子端到端加密&#xff08;E2EE&#xff09;现已面向全球推出&#xff0c;适用于Zoom Workplace。目前&#xff0c;Zoom已将该功能加入Zoom Meetings&#xff0c;稍后将扩展至Zoom Phone和Zoom Rooms。 图…

视频批量裁剪助手:一键式高效缩小视频尺寸,极速提升工作效率的必备神器!

视频已经成为我们日常生活和工作中不可或缺的一部分。无论是个人vlog、企业宣传片&#xff0c;还是教学视频、广告素材&#xff0c;视频都承载着大量的信息和情感。然而&#xff0c;很多时候&#xff0c;我们手中的视频尺寸并不符合我们的需求&#xff0c;这时&#xff0c;一款…

He3DB MySQL计算下推优化设计

前言 计算下推是数据库优化器优化查询性能的一种常见手段&#xff0c;早期的数据库系统提及的计算下推一般是指谓词下推&#xff0c;其 理论源自关系代数理论。 2000 年以后&#xff0c;随着 Oracle RAC 的盛行以及一众开源分布式数据库的崛起&#xff0c;存算分离的概 念逐步…

Denodo 数据虚拟化

Denodo是一家专注于数据虚拟化领域的软件公司&#xff0c;其核心产品Denodo Platform提供了一套全面的数据集成和数据服务解决方案。以下是关于Denodo的介绍、工作原理、应用场景以及在不同行业的应用比较&#xff1a; Denodo介绍 Denodo Platform通过数据虚拟化技术&#xf…

前端常用网站合集

常用网站 Node.js&#xff1a;https://nodejs.cn/Npm&#xff1a;https://www.npmjs.com/MDN&#xff1a;https://developer.mozilla.org/zh-CN/前端兼容性自查工具&#xff1a;https://caniuse.com/Vue3&#xff1a;https://cn.vuejs.org/Vue2&#xff1a;https://v2.cn.vuej…

Linux中的正则表达式

在说正则表达式之前再加几个小知识 1、输出重定向&#xff1a; 标准输出&#xff1a;是将信息输出在终端上 标准错误输出&#xff1a;在执行命令的过程中所产生的错误信息也是输出在终端上的 标准输出&#xff1a;是从键盘输入的 1.1、标准输出重定向 作用&#xff1a;将本来要…

/etc/passwd与/etc/group内容详解

/etc/passwd 在Linux系统中&#xff0c;/etc/passwd是一个文本文件&#xff0c;用于存储系统中的用户账号信息。该文件的每一行代表一个用户账号&#xff0c;包含以下七个字段&#xff0c;每个字段由冒号分隔&#xff1a; 1. 用户名&#xff08;Username&#xff09;&#xf…

k8s 声明式资源管理

一、资源配置清单的管理 1.1 查看资源配置清单 声明式管理方法&#xff1a; 1.适合于对资源的修改操作 2.声明式资源管理方法依赖于资源配置清单文件对资源进行管理 资源配置清单文件有两种格式&#xff1a;yaml&#xff08;人性化&#xff0c;易读&#xff09;&#xff0c;j…

Flink 调度源码分析4:Physical Slot 分配过程

Flink 调度源码分析1&#xff1a;拓扑图创建与提交过程 Flink 调度源码分析2&#xff1a;调度过程 Flink 调度源码分析3&#xff1a;Shared Slot 分配策略 Flink 调度源码分析4&#xff1a;Physical Slot 分配过程 1 整体过程 在 SlotSharingExecutionSlotAllocator.allocate…

【EXCEL_VBA_实战】两组数据比对是否一致(字符串数组)

工作背景&#xff1a;比对两组数据是否一致&#xff08;位置非一一对应&#xff09; 思路构建&#xff1a;两组数据转换为两组字符串数组&#xff0c;比对所包含元素是否相同 问题点&#xff1a;A数组的第一个元素不一定与B数组的第一个元素对应&#xff0c;此时无法通过公式…

es数据备份和迁移Elasticsearch

Elasticsearch数据备份与恢复 前提 # 注意&#xff1a; 1.在进行本地备份时使用--type需要备份索引和数据&#xff08;mapping,data&#xff09; 2.在将数据备份到另外一台ES节点时需要比本地备份多备份一种数据类型&#xff08;analyzer,mapping,data,template&#xff09; …

【Python快速上手(二十六)】- Python3网络编程(下)

目录 Python快速上手&#xff08;二十六&#xff09;- Python3网络编程&#xff08;下&#xff09;Python3 网络编程4. HTTP 编程4.1 HTTP 客户端4.2 HTTP 服务器 5. 网络协议处理5.1 URL 处理5.2 FTP 客户端 6. 实际应用案例6.1 网络爬虫6.2 聊天程序 7. 总结 Python快速上手&…

岛屿问题刷题

200. 岛屿数量 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int numIslands(char[][] grid) {int n grid.length;//grid行数int m grid[0].length;//grid列数int res 0;for(int r 0;r<n;r){for(int c0;c<m;c){if(grid[r][c]1){dfs(grid,r,c);res…

分布式异步框架celery + Redis 安装配置

引入 这里不对web框架做过多说明&#xff0c;到时候在总结一篇 python的常见web框架 django、flask、tornado、sanic、fastapi..各框架区别 - 内部集成功能的多少 django&#xff0c;内部提供了很多组件。 【相对大】flask、tornado、sanic、fastapi… 本身自己功能很少第…

java集合类详解

目录 1、数组导入&#xff1a; 2、单列集合 List接口 1、ArrayList&#xff1a;数组列表 ArrayList类中的方法 2、LinkedList&#xff1a;链表列表 3、Vector&#xff1a;数组列表 4、list集合的遍历 1、for循环遍历 2、增强for循环 3、迭代器遍历 Set接口 1、Has…

data studio连接到虚拟机上的openGauss

参考&#xff1a;使用DataStudio连接本地虚拟机中的opengauss数据库_big data_白日梦想家_胖七七-华为云开发者联盟 本实验虚拟机安装的是CentOS7 数据库版本是&#xff1a;openGauss-5.0.2-CentOS-64bit-all.tar.gz 1.配置pg_hba.conf 首先使用su - omm登录到omm用户&…

MySQL数据库,创建表及其插入数据和查询数据

首先&#xff0c;由上图创建表 mysql> create table worker( -> dept_id int(11) not null, -> emp_id int (11) not null, -> work_time date not null, -> salary float(8,2) not null, -> poli_face varchar(10) not null default 群众, -> name…

vue中引入js脚本块或者js文件 js函数 js方法

一、vue中&#xff0c;使用js函数的方法 在vue文件中&#xff0c;如果想要在组件里&#xff0c;通过事件触发&#xff0c;调用到函数&#xff0c;这个函数需要放在特定的位置&#xff0c;如下&#xff1a; <script> export default {methods: {t1(){},t2(){},t3(){}} }…