springBoot容器功能

一、添加组件

1、@Configuration

        1.1基本使用

        新建一个MyConfig类 , 演示@Configuration + @Bean的作用 , 即相当于spring中的beanx.xml, @Bean 就是bean标签

        此方法,默认是单实例, 即获取多少次都是同一个对象 

        自定义名字, 可以@Bean("value")

@Configuration  //@Configuration 作用相当于spring中的beans.xml,表示当前类是一个配置类
public class MyConfig {
    @Bean     //@Bean 作用相当于xml中的bean,表示当前方法创建一个对象,并且放入spring容器
    public Pet pet() {  
    //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中
//实例
        return new Pet();
    }

    @Bean
    public User user() {
        return new User();
    }
}
// 声明Spring Boot应用的主类,springBoot从这里启动
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        // 启动Spring Boot应用
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        String[] names = run.getBeanDefinitionNames();
        for(String name: names) {
            System.out.println(name);
        }
    }
}

          

1.2 Full模式与Lite模式

      • 配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
      • 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式

/**
 * 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
 * 2、配置类本身也是组件
 * 3、proxyBeanMethods:代理bean的方法
 *      Full(proxyBeanMethods = true)【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
 *      Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
 *      组件依赖必须使用Full模式默认。其他默认是否Lite模式
 **/

//@Configuration 作用相当于spring中的beans.xml,表示当前类是一个配置类
@Configuration(proxyBeanMethods =true)  //proxyBeanMethods 默认值为true
public class MyConfig {
    @Bean     //@Bean 作用相当于xml中的bean,表示当前方法创建一个对象,并且放入spring容器
    public Pet pet() {
        return new Pet("tomcat");
    }

    @Bean
    public User user01() {
        User user = new User(1,"詹姆思");
        user.setUserPet(pet());
        return new User();
    }
}
// 声明Spring Boot应用的主类,springBoot从这里启动
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        // 启动Spring Boot应用, 返回IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

//      proxyBeanMethods = true
        MyConfig myConfig = run.getBean(MyConfig.class);

        User user3 = myConfig.user01();
        User user4 = myConfig.user01();
        System.out.println(user3.hashCode());
        System.out.println(user4.hashCode());
        System.out.println("user3 等于 user4 吗"+(user3 == user4));
    }
}

 2、@Bean、@Component、@Controller、@Service、@Repository

这几个标签还是跟springMVC中,一样使用。如果返回的是jason 数据, 使用 @RestController

3、@import

 * 4、@Import({User.class, DBHelper.class})
 *      给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
 *
 *
 *
 */

@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
}

意思是加载类到ioc容器(可以理解为该类在被需要使用的项目中,才被加载 )

4、@Conditional条件装配

        解释:@Conditional意思是在满足该注释的条件下,才被装配。 以下是常见条件

示例:一定要注意先声明user01, 后边在声明@ConditionalOnBean(name="user01") !!

这里有顺序的问题。  (麻蛋的,视频中讲的是错误的,坑了我一个钟)

@Configuration  //proxyBeanMethods 默认值为true
//@ImportResource("classpath:beans.xml")  //引入其他的配置类
public class MyConfig {
    @Bean("user01")
    public User user01() {
        return new User();
    }
    @ConditionalOnBean(name = "user01")  //在满足 user01被装配到ioc容器的 情况下,pet才被创建
    @Bean
    public Pet pet01() {
        return new Pet();
    }
}

5、 @ImportResource

在需要引入spring学习中使用的beans.xml时,使用这个注解。

(一般主要还是用@Configuration+@Bean的形式)

6、 @ConfigurationProperties 

属性配置绑定  , 如果是配置spring的类, ,那么使用@EnableConfigurationProperties+@ConfigurationProperties 

/**
 * 只有在容器中的组件,才会拥有SpringBoot提供的强大功能
 */
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {

    private String brand;
    private Integer price;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                '}';
    }
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

核酸汇·2024第三届中国核酸药物与新型疫苗产业大会将于5月上海召开

近年来,全球上市的核酸药物数量逐年递增,核酸药物也逐渐成为生物医药投资的重点以及医药企业研发的热点。作为一种具有颠覆性技术的药物,小核酸药物具备多种优势,在抗击传染病、治疗罕见病和慢性病等领域具有巨大的发展潜力, 目前…

安防视频监控系统EasyCVR设备分组中在线/离线数量统计的开发与实现

安防视频监控EasyCVR系统具备较强的兼容性,它可以支持国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协议与SDK,如:海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。EasyCVR平台可覆盖多类型的设备接入&am…

数据加工:从原始数据到有价值的信息

在当今数字化的时代,数据已经成为了企业和组织最宝贵的资产之一。然而,原始数据往往需要经过加工和处理,才能转化为有价值的信息和知识。数据加工是指将原始数据进行处理和分析,以提取有用的信息和知识的过程。数据加工的重要性不…

YOLOv8-Seg改进:轻量化改进 | MobileNetV3,轻量级骨架首选

🚀🚀🚀本文改进:MobileNetV3的创新点包括:使用自适应瓶颈宽度、借鉴SENet中的Squeeze-and-Excitation机制、引入h-swish激活函数等。 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教…

base64与BytesIO图片进行编码、解码;api调用

base64与BytesIO简单介绍 io.BytesIO 和 Base64 编码都是用于在内存中处理二进制数据的方法,但它们的目的和使用场景有所不同。 1) io.BytesIO io.BytesIO 是 Python io 库中的一个类,它提供了一个在内存中处理二进制数据的接口&#xff0…

使用srs_librtmp实现RTMP推流

1、背景 由于项目有需求在一个现有的产品上增加RTMP推流的功能,目前只推视频流。 2、方案选择 由于是在现有的产品上新增功能,那么为了减少总的成本,故选择只动应用软件的来实现需求。 现有的产品中的第三方库比较有限,连个ffmp…

PPT模板,免费下载

找PPT模板、素材,就上这几个网站,免费下载。 1、菜鸟图库 https://www.sucai999.com/search/ppt/0_0_0_1.html?vNTYxMjky 菜鸟图库素材非常齐全,设计、办公、图片、视频等素材这里都能找到,PPT模板数量很可观,模板样…

《AI基本原理和python实现》栏目介绍

一、说明 栏目《AI基本原理和python实现》的设计目的是为了实现相关算法的python编程。因为用python实现AI需对相关的python库进行全方位了解,本栏目基本包含了【机器学习】相关的经典算法,除此之外还包括了数据分析、时间序列等一些概念和相关python代码…

斯坦福Mobile ALOHA提到的ACT之外的另两项技术:Diffusion Policy、VINN

前言 本文接上一篇文章《斯坦福机器人Mobile ALOHA的关键技术:动作分块ACT的算法原理与代码剖析》而来,当然最开始本文是作为上一篇文章的第二、第三部分的 但因为ACT太过关键,除了在上一篇文章中写清楚其算法原理之外,还得再剖…

借助文档控件Aspose.Words,使用 Java 在 Word 文档中创建表格

Microsoft Word 是一种流行的文字处理应用程序,用于创建各种类型的文档。这些文档可能包含多种类型的元素,包括文本、图像、表格和图表。当涉及到用 Java 自动创建和操作文档时,您可能需要一个轻松的解决方案来在 Word 文档中创建表格。因此&…

操作系统课程设计:常用页面置换算法(OPT、FIFO、LRU)的实现及缺页率的计算(C语言)

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder) 目录 一、效果图二、代码(带注释)三、说明 一、效果图 二、代码(带…

@RequestParam

在我们写接口的时候,经常会用到这个注解来标记参数,通过这个注解我们可以把请求的url中的参数名和值映射到被标记的参数上。 比如下方,这个接口是通过传入的参数来查询相关信息的 我们定义这样一个接口,设置了8个参数,…

接口测试工具:Postman的高级用法

Postman 是一款功能强大的 API 开发和测试工具,以下是一些高级用法的详细介绍和操作步骤。【文末有配套视频教程和免费的资料文档领取】 一、环境和全局变量 环境变量允许你设置特定于环境(如开发、测试、生产)的变量,全局变量则…

C++ Primer 6.1 函数基础

函数的形参列表 int func(int v,int v2) {int v,v2;//!错误 } 函数返回类型 不能是数组和函数(两者都不接受对拷),但可以是指针 局部对象 形参和函数体内部的变量称为局部变量,仅在函数内部可见,隐藏外部…

四川天蝶电子商务有限公司助力商家飞向电商蓝海

随着互联网的飞速发展,电商行业已经成为一个不可忽视的经济增长点。在这个大背景下,四川天蝶电子商务有限公司凭借其独特的抖音电商服务,迅速崭露头角,成为了众多商家在电商领域的得力助手。今天,我们将深入了解这家公…

关于markdown文件插入图片变成相对路径

两种方式 第一种方式 ![](绝对路径)变成下面这种相对路径 也就是说每次插入的时候,都得修改一下。 第二种方式 在Typora中,文件——偏好设置——图像——优先选择相对路径 这样问题就解决了。 如果想了解更多的方式,附上链接。 Typora…

Groove闭包

Groovy闭包 - 简书# 闭包 闭包的基础知识 闭包的使用 闭包 this,owner,delegate 的理解 总结 ## 闭包的基础知识 闭包就是一段可以使用参数的代码片段,每个闭包会被编译成...https://www.jianshu.com/p/c73b03cdf986

Android中两种选择联系人方式

1.在选择联系人方式网上也有很多案例 有的说是使用ContactsContract.CommonDataKinds.Phone.CONTENT_URI也有的说是使用ContactsContract.Contacts.CONTENT_URI其实这两种方式都可以使用 只不过ContactsContract.Contacts.CONTENT_URI这种方式需要多查询一遍 一、使用Contacts…

矿山无人驾驶方案

矿山无人驾驶运输系统,可实现露天矿采煤装载运输的无人化,满足智能矿山安全、高效、绿色、环保等目标。 无人驾驶应用的总体技术架构包括“车端、场端、云端”三个层面以及相应的安全保障体系,其中车端的智能矿卡具备车辆感知、通信、决策和执…

[NOIP2006 提高组] 作业调度方案(修改)

题目: 这里对于之前的题目进行修改记录。果然还是受不了等待,利用晚饭时间又看了这个题目。于是发现了问题。 之前的博客:https://blog.csdn.net/KLSZM/article/details/135522867?spm1001.2014.3001.5501 问题修改描述 上午书写的代码中是…