当前位置: 首页 > news >正文

1.Spring-容器-注册

一、@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;}@Beanpublic Dog dog() {return new Dog();}}

(4)注意

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

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

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

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

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

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

 

 

三、MVC分层注解

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

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

@ComponentScan 

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

 

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

解决方法1:

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

解决方法2: 

        @Import

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Ubuntu 22.04 源码下载、编译
  • 【数据结构C语言】【入门】【首次万字详细解析】入门阶段数据结构可能用到的C语言知识,一章让你看懂数据结构!!!!!!!
  • 计算机组成原理之计算机系统的工作原理
  • 第一次安装Pytorch
  • Golang | Leetcode Golang题解之第421题数组中两个数的最大异或值
  • MySql主从复制原理
  • docker 升级步骤
  • C++ prime plus-7-編程練習
  • VMware虚拟机因磁盘空间不足黑屏无法登录
  • matlab绘制二维云图,划分区域,并显示每个区域的均值
  • KVM环境下制作ubuntu qcow2格式镜像
  • 基于SpringBoot的漫画网设计与实现
  • 人工智能快速发展下的极端风险管理
  • 力扣中等 33.搜索旋转排序数组
  • C语言 | Leetcode C语言题解之第415题字符串相加
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • SQLServer之创建显式事务
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue脚手架vue-cli
  • 闭包--闭包作用之保存(一)
  • 记一次和乔布斯合作最难忘的经历
  • 开发基于以太坊智能合约的DApp
  • 使用 QuickBI 搭建酷炫可视化分析
  • 树莓派 - 使用须知
  • 06-01 点餐小程序前台界面搭建
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • # wps必须要登录激活才能使用吗?
  • # 安徽锐锋科技IDMS系统简介
  • #HarmonyOS:基础语法
  • #pragma once
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $.ajax()参数及用法
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (2)MFC+openGL单文档框架glFrame
  • (2015)JS ES6 必知的十个 特性
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (二)pulsar安装在独立的docker中,python测试
  • (二)windows配置JDK环境
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (四)Android布局类型(线性布局LinearLayout)
  • (学习日记)2024.01.19
  • (一)基于IDEA的JAVA基础12
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)EOS中账户、钱包和密钥的关系
  • (转)visual stdio 书签功能介绍
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .Net Remoting常用部署结构
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .NET基础篇——反射的奥妙
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验