1.Spring-容器-注册

news2024/9/22 10:03:23

一、@Bean和获取Bean

(1)创建IoC容器:

SpringApplication.run(类名.class, args);
ConfigurableApplicationContext ioc = SpringApplication.run(Spring01IocApplication.class, args);

 

(2)将对象注册到IoC容器中:

@Bean

(3)获取到IoC容器中的组件对象

1.按照名字获取:需要强转

Person zhangsan = (Person) ioc.getBean("zhangsan");

2.按照类型获取 :同一个类型只有唯一一个

Person bean = ioc.getBean(Person.class);

3.按照类型获取 :同一个类型有多个

Map<String, Person> type = ioc.getBeansOfType(Person.class);

4.按照类型和名字获取 

Person bean = ioc.getBean("zhangsan", Person.class);

 

@SpringBootApplication
public class Spring01IocApplication {
    /**
     * 组件的创建时机:容器启动过程中就会创建组件对象(构造方法在容器创建完成前)
     * 单实例特性:所有组件默认是单例的,每次获取直接从容器中拿。容器提前会创建组件
     */
    public static void main(String[] args) {
        // 一.启动Spring应用上下文:ApplicationContext  IOC容器
        ConfigurableApplicationContext ioc = SpringApplication.run(Spring01IocApplication.class, args);
        System.out.println("-------------------------------------------------------------------------IOC容器创建完成:----------------------------------------------------------------");
        // 二.获取到容器中的组件:
        Dog bean = ioc.getBean(Dog.class);
        System.out.println("Dog=:" + bean);
        Dog bean1 = ioc.getBean(Dog.class);
        System.out.println("Dog=:" + bean1);
        Dog bean2 = ioc.getBean(Dog.class);
        System.out.println("Dog=:" + bean2);
    }

    public static void test01BeanAnnotation(String[] args) {
        // 一.启动Spring应用上下文:ApplicationContext  IOC容器
        ConfigurableApplicationContext ioc = SpringApplication.run(Spring01IocApplication.class, args);
        System.out.println("IOC容器对象:" + ioc);

        // 二.获取到容器中所有组件的名字:容器中装了哪些组件:
//        String[] beanDefinitionNames = ioc.getBeanDefinitionNames();
//        for (String beanDefinitionName : beanDefinitionNames) {
//            System.out.println(beanDefinitionName);
//        }

        // 四.获取容器中的组件对象: → 从容器中“彻底”(而非只获取组件名)获取Bean	→ 前提:组件已经放入容器中
        //组件的四大特性:(名字、类型)、对象、作用域
        /* 名字:默认是方法名,即zhangsan,也可以自定义名字:@Bean("zhangsan111")
        组件名全局唯一,若组件名重复,则一定会给容器中放最先声明的那个(按照顺序排前面的那个)。
         */




        //4.1按照组件名获取对象 getBean(String name),       但需要强转,解决:4,4按照类型+名字获取组件对象
         /*从容器中获取组件对象:
        ①若组件不存在,则抛出异常NoSuchBeanDefinitionException
        ②若组件不唯一,按照类型只要一个时,则抛出异常NoUniqueBeanDefinitionException
        按照名字只要一个时,精确获取到指定对象。
        ③若组件不唯一,要一堆时,返回所有组件的List集合,可以正常运行。            →          4.3按照组件类型获取这种类型的所有组件对象 getBeanOfType(Map<String, T> typeToAutowireCandidates)
         */

        //Object zhangsan = ioc.getBean("zhangsan");//此处已知类型为Person,故可以直接强转
        Person zhangsan = (Person) ioc.getBean("zhangsan");
        System.out.println("从容器中获取到的组件对象:" + zhangsan);


        //4.2按照组件类型获取对象 getBean(Class<T> requiredType),若组件不存在,则抛出异常NoSuchBeanDefinitionException
//        Person bean = ioc.getBean(Person.class);
//        System.out.println("从容器中获取到的组件对象:" + bean);

        //4.3按照组件类型获取这种类型的所有组件对象 getBeanOfType(Map<String,T>
        Map<String, Person> type = ioc.getBeansOfType(Person.class);
        System.out.println("从容器中获取到的组件对象:" + type);

        //4.4按照类型和名字获取组件对象、
        Person bean = ioc.getBean("zhangsan", Person.class);
        System.out.println("从容器中获取到的组件对象:" + bean);

    }

    // 三.给容器中注册一个自己的组件;容器中每个组件都有自己的名字,方法名就是组件的名字 → 给容器中放了一个组件@Bean
    //获取组件名
    @Bean(name = "zhangsan")
    public Person zhangsan() {
        Person person = new Person();
        person.setName("张三");
        person.setAge(18);
        person.setGender("男");
        return person;
    }

    @Bean(name = "lisi")
    public Person lisi() {
        Person person = new Person();
        person.setName("李四");
        person.setAge(18);
        person.setGender("男");
        return person;
    }

    @Bean
    public Dog dog() {
        return new Dog();
    }

}

(4)注意

①组件的创建时机:容器启动过程中就会创建组件对象(构造方法在容器创建完成前)

②单实例特性:所有组件默认是单例的,每次获取直接从容器中拿。容器提前会创建组件 

二、@Configuration:管理组件:使用配置类

将注册进容器中的组件分类管理:使用配置类 分类管理 组件

使用@Configuration告诉Spring容器,这是一个配置类。

配置类也是组件,他是组件中的一种。

 

 

三、MVC分层注解

 首先,分层注解是给人看的,对于Spring来说,实际上标啥注解都是@Component。

但是,需遵守开发规范,即

@ComponentScan 

且分层注解所在能起作用的前提是这些组件必须在主程序所在的包及其子包结构下。假设没在时,可以这样解决,

 

四、@Import:第三方组件想要导入容器中,是没办法快速标注分层注解的。

解决方法1:

        @Bean,自己new,注册给容器 

解决方法2: 

        @Import

 五、若主类上注解太多,则新建一个配置类,专用于放置注解

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

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

相关文章

[Vue] 从零开始使用 Vite 创建 Vue 项目

&#x1f4da; 一、安装 Node.js Node.js 是一个运行 JavaScript 代码的 JavaScript 运行时&#xff0c;它允许我们在服务器端运行 JavaScript 代码。以下是安装 Node.js 的步骤&#xff1a; &#x1f310; 访问 Node.js 国内网站&#xff1a;https://nodejs.cn/ &#x1f4…

【如何在 Windows 10 主机上通过 VMware 安装 Windows 11 虚拟机,并共享主机网络】

环境说明 主机操作系统&#xff1a;Windows 10虚拟机操作系统&#xff1a;Windows 11虚拟机软件&#xff1a;VMware 步骤一&#xff1a;确保主机&#xff08;Windows 10&#xff09;网络连接正常 启动网络加速软件&#xff1a;在主机上启动软件&#xff0c;确保主机可以正常访…

基于LSTM的温度时序预测

1.背景 本文接【时序预测SARIMAX模型】 一文&#xff0c;采用LSTM模型进行平均温度数据预测。具体的背景和数据分析就不做重复说明&#xff0c;感兴趣可以去看上文即可。 2.LSTM模型 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种特殊…

AI驱动TDSQL-C Serverless 数据库技术实战营-ai学生选课系统数据分析

以前用过腾讯的TDSQL-MYSQL&#xff0c;TBASE&#xff0c;最近了解到TDSQL-C serverless&#xff0c;本次试验结合的AI大模型驱动来学习实战TDSQL-C serverless&#xff0c;体验服务化的数据库&#xff0c;和一句简单描述进行学生选课系统数据分析&#xff1b; 我使用的分析数据…

C++初阶-list用法总结

目录 1.迭代器的分类 2.算法举例 3.push_back/emplace_back 4.insert/erase函数介绍 5.splice函数介绍 5.1用法一&#xff1a;把一个链表里面的数据给另外一个链表 5.2 用法二&#xff1a;调整链表当前的节点数据 6.unique去重函数介绍 1.迭代器的分类 我们的这个迭代器…

【alluxio编译报错】Some files do not have the expected license header

Some files do not have the expected license header 快捷导航 在开始解决问题之前&#xff0c;大家可以通过下面的导航快速找到相关资源啦&#xff01;&#x1f4a1;&#x1f447; 快捷导航链接地址备注相关文档-ambaribigtop自定义组件集成https://blog.csdn.net/TTBIGDA…

【Elasticsearch系列十八】Ik 分词器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

通信入门系列书籍推荐一:通信原理和通信原理学习辅导

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、背景 二、通信原理 …

石岩体育馆附近的免费停车场探寻

坐标&#xff1a;石岩体育馆侧的石清大道断头路, 如果运气好的话&#xff0c;遇到刚好有车开出的话&#xff0c;我觉得可以作为中长期的免费停车点 第一次路过的时候&#xff0c;把我震惊了&#xff0c;我一直以为石岩停车位紧张比市区还严重&#xff0c;因为石岩大部分为统建楼…

python画图|图像背景颜色设置

python画图出来的默认图形背景是白色&#xff0c;有时候并不适合大家表达想要表达的意思。 因此&#xff0c;我们很有必要掌握自己设置图形背景颜色的技巧。 【1】官网教程 首先请各位看官移步官网&#xff0c;看看官网如何设置&#xff0c;下述链接可轻松到达&#xff1a; …

Lubuntu电源管理

lxqt-config-powermanagement 打开托盘图标 Show icon 电源管理 电源管理管理笔记本电脑电池的低电量、关闭笔记本电脑盖的操作以及计算机长时间闲置时应采取的措施。 用法 LXQt 电源管理会监控您的电池、笔记本电脑盖、空闲情况&#xff0c;以及当您按下电源或睡眠按钮时会发…

IS-ISv6单拓扑存在的问题

文章目录 IS-ISv6单拓扑配置单拓扑存在的问题解决 IS-ISv6单拓扑B站视频传送门 IS-ISv6单拓扑 配置 R1&#xff1a;sy sy R1 ipv6 inter g0/0/0 ip add 12.1.1.1 24 ipv6 enable ipv add 2001:12::1 64 inter loop0 ip add 1.1.1.1 32 ipv6 enable ipv address 2002::1 128isi…

30个GPT提示词天花板,一小时从大纲到终稿

PROMPT 1 中文&#xff1a;构建研究背景与意义&#xff0c;阐述研究问题的紧迫性和重要性。 English: Establish the research background and significance, elucidating the urgency and importance of the research question. 中文&#xff1a;设计研究目的与目标&#xff…

TDOA方法求二维坐标的MATLAB代码演示与讲解

引言 时间差定位(Time Difference of Arrival, TDOA)是一种用于确定信号源位置的技术,广泛应用于无线通信、声学定位等领域。通过测量信号到达多个接收器的时间差,可以计算出信号源的二维坐标。本文将通过MATLAB代码演示如何使用TDOA方法来求解二维坐标。 TDOA原理 TDOA…

LeetCode题练习与总结:回文链表--234

一、题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#x…

CocosCreator 3.x 实现角色移动与加载时动态屏幕边缘检测

效果 思路 通过cc.view全局单例 View 对象获取屏幕尺寸加载时根据屏幕尺寸动态计算上下左右边缘 代码实现 import { _decorator, Component, EventTouch, Input, input, Node, view } from cc; const { ccclass, property } _decorator;/*** 玩家控制脚本*/ ccclass(Player…

Linux之实战命令03:stat应用实例(三十七)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

树及二叉树(选择题)

树 在树中&#xff0c;总结点数为所有结点的度和再加一 5、设一棵度为3的树&#xff0c;其中度为2&#xff0c;1.0的结点数分别为3&#xff0c;1&#xff0c;6。该树中度为3 的结点数为_。 二叉树 设二叉树的所有节点个数为N&#xff0c;度为零的结点&#xff08;叶子结点…

P9235 [蓝桥杯 2023 省 A] 网络稳定性

*原题链接* 最小瓶颈生成树题&#xff0c;和货车运输完全一样。 先简化题意&#xff0c; 次询问&#xff0c;每次给出 &#xff0c;问 到 的所有路径集合中&#xff0c;最小边权的最大值。 对于这种题可以用kruskal生成树来做&#xff0c;也可以用倍增来写&#xff0c;但不…

数字基带之相移键控PSK

1 相移键控定义 相移键控是指用载波的相移位变化来传递信号&#xff0c;不改变载波的幅度和频率&#xff0c;可用下面的公式表示。 是载波的幅度&#xff0c;是载波的角频率&#xff0c;是载波的瞬时相位&#xff0c;是载波的初始相位。如果需要调制的信号为1bit的二进制数&am…