Spring学习02-[Spring容器核心技术IOC学习]

news2024/12/23 10:34:45

Spring容器核心技术IOC学习

  • 什么是bean?
  • 如何配置bean?
    • @Component方式
    • @bean配合配置类的方式
    • @import导入方式
    • 实现ImportSelector类的方式-批量注册bean
    • 实现ImportBeanDefinitionRegistrar的方式
  • 实例化bean
    • 推断构造函数
      • 使用实例工厂方法实例化----@Bean的方式
    • 使用工厂Bean。实例化-----FactoryBean
  • 依赖注入(DI)
    • @Autowired

什么是bean?

被Spring管理的对象就是bean,和普通对象的区别就是里面bean对象里面的属性也被注入了。

如何配置bean?

@Component方式、@bean配合配置类的方式、@import导入方式、类实现importSelect的方式

@Component方式

在需要被注册成bean的类上加上这个注解就可以了,只要spring能够扫描到,配置了@Component的类会被注册成bean

@Component的扩展注解还有@Service、@Repository

@bean配合配置类的方式

在这里插入图片描述
@bean写在方法上面并且结合配置类

@Configuration
@ComponentScan
public class SpringConfig {
    @Bean
    public User user(){
        return new User();
    }
}

特别注意@bean底层会走cglib动态代理进行增强,代理逻辑就是先从spring容器中去找,如果没找到才会创建bean,找到了直接返回,目的是防止多例bean

  • 测试类
 @org.junit.Test
    public void test(){
        //要依赖spring注入,就需要从spring容器中获取UserService
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        User user = (User) context.getBean("user");
        System.out.println(user);
    }

在这里插入图片描述

@import导入方式

@import注解导入的类会被spring注册成一个bean,一般这个注解放在配置类上,但是也可以放在其他ben类上

@Configuration
@ComponentScan
@Import(User.class)
public class SpringConfig {

}
  • 测试
 @org.junit.Test
    public void test(){
        //要依赖spring注入,就需要从spring容器中获取UserService
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        User user = (User) context.getBean(User.class);
        System.out.println(user);
    }

实现ImportSelector类的方式-批量注册bean

一般配合@import注解使用

@Import(实现ImportSelector.class)

  • 实现了ImportSelector的类
    重写selectImports方法,返回一个字符串数组,里面的内容就是要注册成bean的类的路径全限定名

可以批量注册bean(通过实现selectImports,返回bean的完整类路径字符串数组)

public class UserImportSelect implements ImportSelector {

    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.spring.bean.User"};
    }
}
  • 配合@import
@Configuration
@ComponentScan
@Import(UserImportSelect.class)
public class SpringConfig {

}
  • 测试
 @org.junit.Test
    public void test(){
        //要依赖spring注入,就需要从spring容器中获取UserService
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        User user = (User) context.getBean(User.class);
        System.out.println(user);
    }

实现ImportBeanDefinitionRegistrar的方式

调用BeanDefinition注册器,手动注册一个bean

一般也是配合@import注解使用

public class UserImportSelect implements ImportBeanDefinitionRegistrar {

    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
        //调用BeanDefinition注册器,手动注册一个bean

        RootBeanDefinition beanDefinition=new RootBeanDefinition();
        beanDefinition.setBeanClassName("com.spring.bean.User");

        registry.registerBeanDefinition("user",beanDefinition);
    }
}
  • 配合@import注解
@Configuration
@ComponentScan
@Import(UserImportSelect.class)
public class SpringConfig {

}
  • 测试
 @org.junit.Test
    public void test(){
        //要依赖spring注入,就需要从spring容器中获取UserService
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        User user = (User) context.getBean(User.class);
        System.out.println(user);
    }

实例化bean

Spring在实例化bean的时候,当扫描某个类发现有@component或者其他注解的时候,会调用这个类的无参构造函数,从而实例化bean

推断构造函数

规则:

  • 默认使用无参构造函数
  • 无参构造函数和有参构造函数同时存在,也会默认调用无参构造函数
  • 如果只有一个有参构造函数,spring会用有参构造函数,同时会将有参构造函数的参数实例化bean(有的时候会造成循环依赖问题)
  • 如果有多个有参构造函数,spring就不知道调用哪个了,必须指定默认的构造函数。指定方法就是方法上添加@Autowired注解,如下所示
@Data
public class User {
    private Integer id;
    private String name;

    private Person person;

    private UserService userService;

    public User(Person person) {
        System.out.println("创建user的构造函数");
        this.person = person;
    }

    //指定默认的构造函数
    @Autowired
    public User(Person person, UserService userService) {
        this.person = person;
        this.userService = userService;
    }
}

使用实例工厂方法实例化----@Bean的方式

可以自由的选择构造函数进行实例化

使用工厂Bean。实例化-----FactoryBean

  • FactoryBean是一个接口

  • 需要有一个Bean,一旦这个Bean实现FactoryBean就成为了特殊的Bean
    在这里插入图片描述

  • 可以自由的选择构造函数进行实例化
    特殊 就是根据bean的名字实际上是获取getObject返回的对象(狸猫换太子)

  • 实现FactoryBean的方法

@Data
@Component
public class User implements FactoryBean<Person> {
    private Integer id;
    private String name;

    //特殊 就是根据bean的名字实际上是获取getObject返回的对象(狸猫换太子)
    public Person getObject() throws Exception {
        return new Person();
    }

    public Class<?> getObjectType() {
        return null;
    }
}
  • 测试
 @org.junit.Test
    public void test(){
        //要依赖spring注入,就需要从spring容器中获取UserService
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        System.out.println(context.getBean("user"));
    }

可以看到返回的bean是getobject方法返回实例化bean
在这里插入图片描述

依赖注入(DI)

@Autowired

要实现依赖注入一定要使用@Autowired?
1、@Bean方法的参数会自动注入
2、构造函数的参数也会自动注入

  • 特性:
  • 可以写在方法、构造函数、字段
    1、写在构造函数(一般是多个有参构造函数,用@Autowired加在构造函数上来指定默认的构造函数)
    2、写在字段:表示依赖注入
    3、写在方法:方法里的参数会自动注入
  • 先byType后byName
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

你的编程小助手:Kimi!!【送源码】

从OpenAI发布AI大模型到现在已经快2年时间&#xff0c;中间随着新模型的不断出现&#xff0c;也让大家认识到了AI的强大之处&#xff0c;现在AI已经渗透到我们生活&#xff0c;工作的方方面面。 这期间国产大模型也在努力发展&#xff0c;不断完善&#xff0c;甚至一些大模型在…

【unity笔记】五、UI面板TextMeshPro 添加中文字体

Unity 中 TextMeshPro不支持中文字体&#xff0c;下面为解决方法&#xff1a; 准备字体文件&#xff0c;从Windows系统文件的Fonts文件夹里拖一个.ttf文件&#xff08;C盘 > Windows > Fonts &#xff09; 准备字库文件,新建一个文本文件&#xff0c;命名为“字库”&…

【计算机毕业设计】079基于微信小程序网上商城设计

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

自研网关架构设计

网关项目 1. 了解网关网关横向对比为什么自研网关 2. 架构设计技术栈技术要点异步化设计使用缓存缓冲合理使用串行化吞吐量为王合适的工作线程 架构图 1. 了解网关 概念 访问数据、业务逻辑或功能的 “前门”负责处理接受和处理调用过程中的所有任务 类型 RESTful APl 使用…

数据结构_优先级队列(堆)

目录 一、优先级队列 1.1 堆 1.2 PriorityQueue接口 二、模拟实现优先级队列 2.1 初始化 2.2 创建大根堆 (向下调整) 2.3 堆的插入 2.4 堆的删除 2.5 堆排序 总结 一、优先级队列 优先级队列是一种特殊的队列&#xff0c;其出队顺序与入队顺序无关&#xff0c;而与优…

如何清空Comfyui的gpu缓存

由于我电脑上同时装了两个Comfyui作为我站点的绘图服务&#xff0c;一个是给正式服使用&#xff0c;一个是开发测试使用&#xff0c;在使用过程中经常会因为两个Comfyui服务跑图后没有自动释放显存导致爆显存。所以我需要让Comfyui跑完图之后可以自动释放显存。 我自己在网上找…

Python的Django部署uwsgi后自签名实现的HTTPS

通过SSL/TLS来加密和客户端的通信内容。提高网络安全性&#xff0c;但是会损耗部分的服务器资源。 HTTPS 的原理图。 web.key 是打死也不能给其他人的。一定要保存好。里面主要是私钥。是各种认证的根基。本地测试的话生成1024的即可&#xff0c;如果是生产环境推荐使用2048。…

高考后的抉择:专业优先还是学校优先?

随着2024年高考的帷幕落下&#xff0c;高考生们面临的一个重要抉择再度浮上心头&#xff1a;在分数受限的情况下&#xff0c;是选择一个心仪的专业&#xff0c;还是选择一个知名度更高的学校&#xff1f;这是一个困扰了众多考生和家长的长期难题。在这个关键的时刻&#xff0c;…

Vip-智能预估+大数据标签+人群全选=用户分群!

Mobpush用户分群功能升级&#xff0c;创建推送入口vip用户可进入自有选择标签创建“用户分群”&#xff0c;相比于免费标签&#xff0c;“用户标签”维度更丰富。在应用基础属性上&#xff0c;增加“品牌”、“网络状态”、“运营商”&#xff0c;众所周知&#xff0c;不同厂商…

公文出错事非小,这些公文写作的常见错误,你中过招吗?

公文是企事业单位、相关部门内外沟通交流的重要工具&#xff0c;不少“笔杆子”经常需要与公文打交道&#xff0c;每天会接触大量的公文。然而在公文撰写的细微之处&#xff0c;稍有不慎&#xff0c;便可能犯下一些常见的错误。这些错误如同蚁穴&#xff0c;虽小却足以破坏公文…

图片管理大革新:一键批量转换、美化与底片效果制作,轻松打造专业级图片库!

在数字时代&#xff0c;图片已成为我们生活、工作中不可或缺的一部分。然而&#xff0c;随着图片数量的不断增加&#xff0c;如何高效、便捷地管理、转换和美化这些图片&#xff0c;成为了许多人头疼的问题。今天&#xff0c;我们向您推荐一款全新的图片批量管理工具&#xff0…

边缘计算盒子是什么、有哪些作用?如何选型?这篇文章全面帮你了解!边缘计算云服务器ECS

一、边缘盒子是什么&#xff1f; 近年&#xff0c;边缘盒子被大家所了解&#xff0c;那么边缘盒子到底是什么呢&#xff1f; 边缘计算盒子内部配置了丰富的 AI 算法&#xff0c;这些算法可以帮助用户在很多场景下实现数据识别等作用。比如&#xff0c;在工地场景下安装边缘盒…

Nvidia jetson Orin/RK3588+AI仿生事件相机

EVS 事件相机 速度&#xff0c;性能&#xff0c;效率和安全&#xff0c;为自动驾驶、自动化和高速运动带来新的高度 采用SONY IMX646 EVS图像传感器&#xff0c;基于PROPHESEE METAVISION 技术 高帧率&#xff0c;120dB高动态范围 实现高速和高时间分辨率。现在已经没有帧率的概…

po文件并转换成mo文件

po文件转换成mo文件 简介 .po和.mo文件是WordPress中语言相关的两种文件。po 是Portable Object(可移植对象)的缩写&#xff0c;存放待翻译的字符串信息&#xff0c;可直接用文本编辑器打开编辑&#xff1b;mo 是Machine Object的缩写&#xff0c;二进制文件&#xff0c;程序…

SmartEDA电路仿真教学VS传统教学:谁将颠覆未来教育战场?

在科技飞速发展的今天&#xff0c;教育领域也迎来了前所未有的变革。传统的教学方式正面临着在线教学工具的强劲挑战&#xff0c;特别是在电路仿真教学领域&#xff0c;SmartEDA这样的在线工具正逐渐崭露头角。那么&#xff0c;SmartEDA电路仿真教学与传统教学之间&#xff0c;…

超支化聚合物(HBPs)应用潜力巨大 我国研究、产业化及应用取得了显著进展

超支化聚合物&#xff08;HBPs&#xff09;应用潜力巨大 我国研究、产业化及应用取得了显著进展 超支化聚合物简称HBPs&#xff0c;是一类高度支化的三维拓扑高分子&#xff0c;由沿聚合物骨架随机分布的树枝状单元、线性单元、末端单元组成。超支化聚合物结构独特&#xff0c;…

一名HR,在招聘嵌入式开发岗位,为什么感觉一年比一年难?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 1.嵌入式学用不一致, 高…

【星海随笔】vue+vite

开头问一个问题&#xff0c;我发现有的人粉丝是点赞数的好几倍&#xff0c;可能和必须关注他才能阅读他的文章有关。 所以问一下怎么设置为关注才能查看该文章。 screen -ls #查看 id 列表 screen -S <session_name> # 创建一个会话 screen -R <session_id> # 根据…

高考填报志愿三连问,从人格优势分析兴趣和专业

“我的兴趣爱好什么&#xff1f;” “我的理想是什么&#xff1f;” “我想成为什么&#xff1f;” ------高考填报志愿三连问&#xff01; 最近我在知乎上看过一个比较有意义的提问&#xff0c;提问的也是高考填报志愿的同学&#xff0c;自从高考后&#xff0c;每日三连问&…

笔记本电脑升级实战手册[1]:开始之前的准备与清单

文章目录 前言&#xff1a;一、升级流程1. 备份2. 清灰换硅脂3. 扩展内存与硬盘4. 硬盘设置5. 系统重装6. 升级后性能测试 二、升级清单1. 工具清单2. 升级清单 总结&#xff1a; 前言&#xff1a; 将要毕业之际&#xff0c;发现我的笔记本电脑已经陪我“征战沙场”快有四年之…