springboot中的@Configuration详解~

news2024/11/20 2:30:33

作用1:告诉springboot这是一个配置类,等同于之前在spring中的配置文件,而且配置类中可以使用@Bean标注在方法上给容器注册组件,该组件默认也是单例

创建pet:

package com.springboot.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Pet {
    private String name;
}

创建User:

package com.springboot.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private Integer age;
}

在spring中,我们将组件交给IOC容器进行管理是通过如下所示的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--使用原始的方式进行,springboot不再沿用该方法-->
    <bean id="user01" class="com.springboot.bean.User">
        <property name="name" value="张三"></property>
        <property name="age" value="18"></property>
    </bean>
    <bean id="MyPet" class="com.springboot.bean.Pet">
        <property name="name" value="小猫"></property>
    </bean>
</beans>

而在springboot中,我们可以通过在类上添加@Configuration注解,添加该注解的类被认为是一个配置类,会被IOC容器管理@Configuration注解告诉Spring容器,该类是一个配置类,Spring会扫描该类中的@Bean注解,将其标记为一个Bean,并将其加入到IOC容器中进行管理。

如下所示:

package com.springboot;

import com.springboot.bean.Pet;
import com.springboot.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfig {
    @Bean//添加组件,以方法名作为组件的id,返回类型就是组件类型,返回的值就是组件在容器中的实例对象
    public User user01(){
            return new User("张三",18);
    }
    //如果不想让方法名作为组件名,那么可以在Bean注解中自定义名称,如下所示
    @Bean("tom")
    public Pet MyPet(){
        return new Pet("哈基米");
    }
}

下面我们可以在启动类中获取该组件,如下所示:

package com.springboot;

import com.springboot.bean.Pet;
import com.springboot.bean.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
      ConfigurableApplicationContext run= SpringApplication.run(MainApplication.class,args);
        //从容器中获取的每个组件都是单例的
        User user1=run.getBean("user01", User.class);
        User user2=run.getBean("user01",User.class);
        System.out.println(user1);
        System.out.println(user2);
        System.out.println(user1==user2);
        Pet pet1=run.getBean("tom", Pet.class);
        Pet pet2=run.getBean("tom", Pet.class);
        System.out.println(pet1);
        System.out.println(pet2);
        System.out.println(pet1==pet2);
    }
}

输出如下所示:

User(name=张三, age=18)
User(name=张三, age=18)
true
Pet(name=哈基米)
Pet(name=哈基米)
true

作用2:添加@Configuration的类被视为配置类,其配置类本身也是一个组件

如下所示我们也可以在启动类中进行获取该配置类

MyConfig myConfig= run.getBean(MyConfig.class);
System.out.println(myConfig);

输出如下所示:

com.springboot.MyConfig$$EnhancerBySpringCGLIB$$549b0910@347bdeef

作用三:该注解有个属性proxyBeanMethods,它的默认值如下所示是true

在这里插入图片描述

将该属性设置为true[Full模式]表明是代理对象调用方法springboot总是会检查当前要调用的该组件是否在容器中已存在,只要存在,那么外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器的单实例对象,而将该属性设置为false[Lite模式]表明配置类在容器中再也不会保存代理类对象,因此在外部类进行调用时,每次调用都会产生一个新的对象

启动类:

package com.springboot;

import com.springboot.bean.Pet;
import com.springboot.bean.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
      ConfigurableApplicationContext run= SpringApplication.run(MainApplication.class,args);
       MyConfig myConfig= run.getBean(MyConfig.class);
       User user1=myConfig.user01();
       User user2=myConfig.user01();
       System.out.println(user1==user2);//输出true
       Pet pet1=myConfig.MyPet();
       Pet pet2=myConfig.MyPet();
       System.out.println(pet1==pet2);//输出true
    }
}

那么到底是将其设置为false还是true呢?这取决于我们实际的需求,如果配置类组件之间没有依赖关系,那么我们将其设置为false因为跳过了检查容器中是否有该对象的过程,加速了容器的启动过程而配置类组件之间有依赖关系,我们应将其设置为true,因为方法会被调用得到之前单实例组件。

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

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

相关文章

【进阶C语言】进阶指针--学会所有指针类型

本节内容大致目录&#xff1a; 1.字符指针 2.指针数组&#xff08;数组&#xff09; 3.数组指针 &#xff08;指针&#xff09;--比较重要 4.函数指针--比较重要 5.函数指针数组--用的较少 6.指向函数指针数组的指针--只需要了解就可以 需要掌握每一种类型的符号和用处。…

Google ProtoBuf介绍

一、背景 前段时间了解到有公司用gRPC、Pulsar、Nacos、SkyWalking、OpenTelemetry、Prometheus、Envoy、Grafana、Sonar、PowerJob、Apollo 这些技术&#xff0c;也是Java路线的&#xff0c;很惭愧&#xff0c;这些我几乎都不了解&#xff0c;从13年以来玩Android、玩Python、…

Java 多输入框查询需求实现

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 多输入框查询 需求分析 任意一个输入框&#xff0c;输入内容点击搜索都可以精准搜索到对应的内容 代码实现 Controller接口编写 PostMapping("merchant/manage&…

文献阅读:RLAIF: Scaling Reinforcement Learning from Human Feedback with AI Feedback

文献阅读&#xff1a;RLAIF: Scaling Reinforcement Learning from Human Feedback with AI Feedback 1. 文章简介2. 方法介绍 1. 整体方法说明 3. 实验结果 1. RLHF vs RLAIF2. Prompt的影响3. Self-Consistency4. Labeler Size的影响5. 标注数据的影响 4. 总结 & 思考 文…

SpringCloudGateway网关中各个过滤器的作用与介绍

文章目录 RemoveCachedBodyFilterAdaptCachedBodyGlobalFilterNettyWriteResponseFilterForwardPathFilterRouteToRequestUrlFilterWebSocketRoutingFilterNettyRoutingFilterForwardRoutingFilterDispatcherHandler 是什么&#xff1f;⭐如何确定最后的路由路径&#xff1f;下…

一文拿捏Spring之AOP

Spring 1.Spring的理解 1.狭义上 指SpringFramework&#xff0c;特别的控制反转、依赖注入、面向切面、等特性 2.广义上 Spring家族的一系列产品&#xff0c;像SpringMVC、SpringBoot、SpringCloud等 2.aop &#x1f31f;面试题(aop): 简单介绍一下AOP&#xff1f; aop…

【userfaultfd】2021强网杯notebook

程序分析 老规矩&#xff0c;看下启动脚本 开启了 smep、smap、kaslr 保护&#xff0c;当然 kvm64 默认开启 kpti 保护 文件系统初始化脚本 #!/bin/sh /bin/mount -t devtmpfs devtmpfs /dev chown root:tty /dev/console chown root:tty /dev/ptmx chown root:tty /dev/tty…

SAAJ:SOAP with Attachments API for Java

介绍 支持带附件的SOAP消息Java接口&#xff08;SAAJ&#xff1a;SOAP with Attachments API for Java&#xff09;&#xff0c;定义了一套API&#xff0c;使开发者可以产生、消费遵从SOAP 1.1, SOAP 1.2, 和SOAP Attachments Feature的消息。 2019年SAAJ更改为新的名字&…

MIP精确算法的关键——确定界

目录 1.界是什么&#xff1f; 2. 如何更新上下界 2.1 以分支定界为框架的一系列算法 2.2 benders分解 MIP精确算法包含&#xff0c;分支定界、分支切割、分支定价还有benders分解等等。前者是以分支定界为框架的一类算法&#xff1b;后者是以分解为框架的一类算法。甚至还包…

Springboot学习笔记——1

Springboot学习笔记——1 一、快速上手Springboot1.1、Springboot入门程序开发1.1.1、IDEA创建Springboot项目1.1.2、官网创建Springboot项目1.1.3、阿里云创建Springboot项目1.1.4、手工制作Springboot项目 1.2、隐藏文件或文件夹1.3、入门案例解析1.3.1、parent1.3.2、starte…

嵌入式软件架构基础设施设计方法

大家好&#xff0c;今天分享一篇嵌入式软件架构设计相关的文章。 软件架构这东西&#xff0c;众说纷纭&#xff0c;各有观点。在我看来&#xff0c;软件架构是软件系统的基本结构&#xff0c;包含其组件、组件之间的关系、组件设计与演进的规则&#xff0c;以及体现这些规则的基…

Nginx高级 第一部分:扩容

Nginx高级 第一部分&#xff1a;扩容 通过扩容提升整体吞吐量 1.单机垂直扩容&#xff1a;硬件资源增加 云服务资源增加 整机&#xff1a;IBM、浪潮、DELL、HP等 CPU/主板&#xff1a;更新到主流 网卡&#xff1a;10G/40G网卡 磁盘&#xff1a;SAS(SCSI) HDD&#xff08;机械…

【C/C++笔试练习】——常量指针和指针常量、结构体内存分配、统计输入的字母个数、排序子序列、倒置字符串

文章目录 C/C笔试练习1.常量指针和指针常量&#xff08;1&#xff09;常量指针和指针常量的定义&#xff08;2&#xff09;判别常量指针和指针常量&#xff08;3&#xff09;常量指针和指针常量的特性 2.结构体内存分配&#xff08;4&#xff09;计算结构体大小&#xff08;5&a…

【计算机】CPU,芯片以及操作系统概述

1.CPU 什么是CPU? CPU&#xff08;Central Processing Unit&#xff09;是计算机系统的运算和控制核心&#xff0c;是信息处理、程序运行的最终执行单元&#xff0c;相当于系统的“大脑”。 CPU的工作流程&#xff1f; CPU 的工作流程分为以下 5 个阶段&#xff1a;取指令…

C++ -- 学习系列 关联式容器 set 与 map

一 关联式容器是什么&#xff1f; c 中有两种容器类型&#xff1a;关联式容器与序列式容器&#xff08;顺序容器&#xff09; 关联式中的容器是按照关键字来存储与访问的&#xff0c;序列式容器&#xff08;顺序容器&#xff09;则是元素在容器中的相对位置来存储与访问的。…

C++标准模板(STL)- 类型支持 ()

对象、引用、函数&#xff08;包括函数模板特化&#xff09;和表达式具有称为类型的性质&#xff0c;它限制了对这些实体所容许的操作&#xff0c;并给原本寻常的位序列提供了语义含义。 附加性基本类型及宏 实现定义的空指针常量 NULL 定义于头文件 <clocale> 定义于…

2.类与对象 拜访对象村

2.1 椅子大战 在图形接口画出正方形、圆形与三角形。当用户选点图形时&#xff0c;图形需要顺时针转360并依据形状的不同播放播放不同的AIF文件。胜者可以坐上名贵宝椅。 面向过程&#xff1a; rotate(shapeNum) {//旋转360 } playSound(shapeNum) {//查询播放哪个AIF文件//播…

嵌入式Linux应用开发-驱动大全-同步与互斥②

嵌入式Linux应用开发-驱动大全-同步与互斥② 第一章 同步与互斥②1.3 原子操作的实现原理与使用1.3.1 原子变量的内核操作函数1.3.2 原子变量的内核实现1.3.2.1 ATOMIC_OP在 UP系统中的实现1.3.2.2 ATOMIC_OP在 SMP系统中的实现 1.3.3 原子变量使用案例1.3.4 原子位介绍1.3.4.1…

pyqt5使用经验总结

pyqt5环境配置注意&#xff1a; 安装pyqt5 pip install PyQt5 pyqt5-tools 环境变量-创建变量名&#xff1a; 健名&#xff1a;QT_QPA_PLATFORM_PLUGIN_PATH 值为&#xff1a;Lib\site-packages\PyQt5\Qt\plugins pyqt5经验2&#xff1a; 使用designer.exe进行设计&#xff1…