Spring Boot之容器功能

news2024/9/22 23:25:19

目录

一.Spring 注入组件的注解

二.@Configuration

1.代码演示

1.1JavaBean--》Monster.java

1.2配置类

1.3执行代码

2.@Configuration 注意事项和细节

三.@Import

1.创建两个JavaBean类

2.注入类

3.测试注解的使用

四.@Conditional

1.@Conditional 介绍

2.应用实例  

五.@ImportResource

1.作用:

2.@ImportResource 应用实例 

六.配置绑定

1.代码演示

2.配置绑定还有第 2 种方式

海绵的思路(可能错误):

3.注意事项和细节


一.Spring 注入组件的注解

@Component@Controller@Service@Repository

说明: 这些在 Spring 中的传统注解仍然有效,通过这些注解可以给容器注入组件

二.@Configuration

SpringBoot, 通过 @Configuration 创建配置类来注入组件

1.代码演示

1.1JavaBean--》Monster.java

ublic class Monster {

    private Integer id;
    private String name;
    private Integer age;
    private String skill;

    public Monster(Integer id, String name, Integer age, String skill) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.skill = skill;
    }

    public Monster() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }

    @Override
    public String toString() {
        return "Monster{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", skill='" + skill + '\'' +
                '}';
    }
}

1.2配置类

/**
 * @author 海绵hong
 * @version 1.0
 * <p>
 * 解读
 * 1. @Configuration 标识这是一个配置类, 等价于配置文件
 * 2. 程序员可以通过@Bean 注解注入bean对象到容器
 * 3. 当一个类被 @Configuration 标识,该类-Bean 也会注入容器
 */
@Configuration
public class BeanConfig {

    /**
     * 解读
     * 1. @Bean : 给容器添加组件, 就是Monster bean
     * 2. monster01() : 默认 你的方法名monster01 作为Bean的名字/id
     * 3. Monster : 注入类型, 注入bean的类型是Monster
     * 4. new Monster(200,"牛魔王",500,"疯魔拳") 注入到容器中具体的Bean信息
     * 5. @Bean(name = "monster_nmw") : 在配置、注入Bean指定名字/id monster_nmw
     * 6. 默认是单例注入
     * 7. 通过 @Scope("prototype")  可以每次返回新的对象,就多例.
     */
    //@Bean(name = "monster_nmw")
    @Bean
    //@Scope("prototype")
    public Monster monster01() {
        return new Monster(200, "牛魔王", 500, "疯魔拳");
    }

}

1.3执行代码

        //启动springboot应用程序/项目
        ConfigurableApplicationContext ioc =
                SpringApplication.run(MainApp.class, args);   
 //  ===演示 @Configuration start ====
        
        Monster monster01 = ioc.getBean("monster01", Monster.class);
        Monster monster02 = ioc.getBean("monster01", Monster.class);
        
        System.out.println("monster01--" + monster01 + " " + monster01.hashCode());
        System.out.println("monster02--" + monster02 + " " + monster02.hashCode());

        //===演示 @Configuration end ====

2.@Configuration 注意事项和细节

1. 配置类本身也是组件, 因此也可以获取 , 测试 修改 MainApp.java
    public static void main(String[] args) {
        ConfigurableApplicationContext ioc =
                SpringApplication.run(MainApp.class, args);
//解读
//1. ioc.getBean("monster01", Monster.class) 是从 BeanConfig 配置类/容器获取 bean 实例
//2. 默认是单列模式, 所以 monster01 == monster02
//获取 BeanConfig 配置类的组件/bean 实例
        Monster monster01 = ioc.getBean("monster01", Monster.class);
        System.out.println(monster01);
        Monster monster02 = ioc.getBean("monster01", Monster.class);
        System.out.println(monster01 == monster02);
//解读
//配置类本身也是组件, 因此也可以获取
        BeanConfig beanConfig = ioc.getBean(BeanConfig.class);
        System.out.println("beanConfig= " + beanConfig);
    }
2. SpringBoot2 新增特性: proxyBeanMethods 指定 Full 模式 (全模式)和 Lite 模式(简化模式)
1. proxyBeanMethods:代理bean的方法
 (1) Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的, 是代理方式】
 (2) Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的, 是非代理方式】 
(3) 特别说明: proxyBeanMethods 是在 调用@Bean方法 才生效,因此,需要先获取BeanConfig 组件,再调用方法 而不是直接通过 SpringBoot 主程序得到的容器来获取bean, 注意观察直接通过ioc.getBean() 获取Bean, proxyBeanMethods 值并没有生效 
(4) 如何选择: 组件依赖必须使用Full模式默认。如果不需要组件依赖使用 Lite模 
(5) Lite模 也称为轻量级模式,因为不检测依赖关系,运行速度快
@Configuration(proxyBeanMethods = false)
public class BeanConfig {
        //===演示@Configuration(proxyBeanMethods = xxx) start

        //1. 先得到BeanConfig组件
        BeanConfig beanConfig = ioc.getBean(BeanConfig.class);
        Monster monster_01 = beanConfig.monster01();
        Monster monster_02 = beanConfig.monster01();

        System.out.println("monster_01-" + monster_01 + " " + monster_01.hashCode());
        System.out.println("monster_02-" + monster_02 + " " + monster_02.hashCode());


        //特别说明: proxyBeanMethods 是在 调用@Bean方法 才生效,因此,需要先获取BeanConfig 组件,再调用方法
        //1. 而不是直接通过 SpringBoot 主程序得到的容器来获取bean, 注意观察直接通过ioc.getBean() 获取Bean, proxyBeanMethods 值并没有生效

        Monster monster01 = ioc.getBean("monster01", Monster.class);
        Monster monster02 = ioc.getBean("monster01", Monster.class);
        System.out.println("monster01-" + monster01 + " " + monster01.hashCode());
        System.out.println("monster02-" + monster02 + " " + monster02.hashCode());

        //===演示@Configuration(proxyBeanMethods = xxx) end
3. 配置类可以有多个 , 就和 Spring 可以有多个 ioc 配置文件是一个道理

三.@Import

SpringBoot, 通过 @Import 来注入组件(和@Configuration一样都是注入bean

1.创建两个JavaBean类

Cat+Dog

2.注入类

/**
 * 解读
 * 1. @Import 代码 可以看到,可以指定 class的数组, 可以注入指定类型的Bean
 * public @interface Import {
 *
 * 	 	Class<?>[] value()}
 *
 * 2. 通过@Import 方式注入了组件, 默认组件名字/id就是对应类型的全类名
 */

@Import({Dog.class, Cat.class})

3.测试注解的使用

  //启动springboot应用程序/项目
        ConfigurableApplicationContext ioc =
                SpringApplication.run(MainApp.class, args);   
//===测试@Import 使用 start

        Dog dogBean = ioc.getBean(Dog.class);
        Cat catBean = ioc.getBean(Cat.class);
        System.out.println("dogBean--" + dogBean);
        System.out.println("catBean--" + catBean);

        //===测试@Import 使用 end

四.@Conditional

1.@Conditional 介绍

1. 条件装配:满足 Conditional 指定的条件,则进行组件注入
2. @Conditional 是一个根注解,下面有很多扩展注解

2.应用实例  

1. 要求 : 演示在 SpringBoot, 如何通过 @ConditionalOnBean 来注入组件
2. 只有在容器中有 name = monster_nmw 组件时,才注入 dog01, 代码如图
    @Bean
    /**
     * 解读
     * 1. @ConditionalOnBean(name = "monster_nmw") 表示
     * 2. 当容器中有一个Bean , 名字是monster_nmw (类型不做约束), 就注入dog01这个Dog bean
     * 3. 如果没有 名字是monster_nmw Bean 就不注入dog01这个Dog bean
     * 4. 还有很多其它的条件约束注解,小伙伴可以自己测试
     *
     * 5. @ConditionalOnMissingBean(name = "monster_nmw") 表示在容器中,
     * 没有 名字/id 为 monster_nmw 才注入dog01这个Bean
     *
     * 6. @ConditionalOnBean(name = "monster_nmw") 也可以放在配置类
     * 表示对该配置类的所有要注入的组件,都进行条件约束.
     *
     */
    @ConditionalOnBean(name = "monster_nmw")
    //@ConditionalOnMissingBean(name = "monster_nmw")
    public Dog dog01() {
        return new Dog();
    }

五.@ImportResource

1.作用:

原生配置文件引入 , 也就是可以直接导入 Spring 传统的 beans.xml ,可以认 为是 SpringBoot Spring 容器文件的兼容 .(原来依靠借口或者类来导入,现在可以使用该注解进行判断)

2.@ImportResource 应用实例 

@Configuration
//导入beans.xml - 就可以获取到beans.xml 中配置bean
@ImportResource(locations = {"classpath:beans.xml","classpath:beans02.xml"})//配置两个bean文件
public class BeanConfig3 {
}
        //===测试@Import 使用 start

        Dog dogBean = ioc.getBean(Dog.class);
        Cat catBean = ioc.getBean(Cat.class);
        System.out.println("dogBean--" + dogBean);
        System.out.println("catBean--" + catBean);

        //===测试@Import 使用 end

六.配置绑定

一句话:使用 Java 读取到 SpringBoot 核心配置文件 application.properties 的内容,
并且把它封装到 JavaBean

1.代码演示

#设置Furn的属性k-v
#前面的 furn01 是用于指定/区别不同的绑定对象, 这样可以再绑定Furn bean属性值时
#通过furn01 前缀进行区分
#furn01.id 中的id 就是你要绑定的 Furn bean的属性名
furn01.id=100
furn01.name=TV
furn01.price=1000.9
@Component
@ConfigurationProperties(prefix = "furn01")
public class Furn {
    private Integer id;
    private String name;
    private Double price;


}

会读取核心配置文件的信息,然后放入容器

2.配置绑定还有第 2 种方式

注意 : 注销
@Component 需 要 在 BeanConfig.java( 说 明 : 也 可 以 是 其 它 配 置 类 ) 配 置
@EnableConfigurationProperties ( Furn . class ), 否则会提示错误

 

//@EnableConfigurationProperties(Furn.class)解读
//1、开启 Furn 配置绑定功能
//2、把 Furn 组件自动注册到容器中
@EnableConfigurationProperties(Furn.class)
public class BeanConfig {
}

海绵的思路(可能错误):

@Component注解标识掉之后,就不会去读取到容器中,但是在控制器中@EnableConfigurationProperties(Furn.class)被添加,那么底层应该就是这样一个思路:将这个启用配置属性明确配置那个类的信息,然后在那个对应的JavaBean类中有@ConfigurationProperties(prefix = "furn01")这个配置就可以读取到,并且直接将这个信息发送到了控制器中,所有在之后添加了那个注解之后便没有报错

3.注意事项和细节

1. 如果 application.properties 有中文 , 需要转成 unicode 编码写入 , 否则出现乱码
#设置属性 k-v
furn01.id=100
furn01.name=soft_chair\u6c99\u53d1!!
furn01.price=45678.9
2. 使用 @ConfigurationProperties (prefix = "furn01" ) 会提示如下信息 , 但是不会影响使用

3. 解决 @ConfigurationProperties(prefix = "furn01") 提示信息, pom.xml 增加依赖, 即可 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

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

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

相关文章

攻防世界 看雪看雪看雪

看雪看雪看雪 题目附件里面给了张图 尝试文件拆解 无果 尝试放入winhex查找信息 无果 尝试放入stegsolve查找信息 无果 题目说雪 刚好有一种snow隐写的方法 但好像跟图片没有什么关系 后来发现存在ntfs流隐写 你解压之后也可以看到 这里我们使用7zip打开附件的压缩包…

【长难句分析精讲】同位语从句

分析技巧 形式&#xff1a; 抽象名词 that / whether形式&#xff1a; 具体名词 同位语&#xff08;名词短语&#xff09;如&#xff1a;成都&#xff0c;四川省会 练习一 一划二从三主 这里 and 不是关键词 苹果掉到地上而不是掉到树上这个事实&#xff0c;回答了他一直都…

【Jmeter基础篇】05:Linux服务器上部署并运行Jmeter脚本

配置之前请务必已安装JDK并配置好JDK的环境变量。 1. 上传压缩包到Linux服务器 使用FTP即可&#xff08;最好是新建一个/usr/Application/Jmeter的文件夹&#xff0c;放进去。也可以使用自己喜欢的路径&#xff09; # -p的作用是防止当上层文件夹不存在时报错。想体验的话可以…

Flink的六种物理分区策略

文章目录物理分区&#xff08;Physical Partitioning&#xff09;&#x1f355;1.随机分区&#xff08;shuffle&#xff09;&#x1f354;2.轮询分区&#xff08;Round-Robin&#xff09;&#x1f35f;3. 重缩放分区&#xff08;rescale&#xff09;&#x1f32d;4.广播&#x…

深度学习入门(三十八)计算性能——多GPU训练

深度学习入门&#xff08;三十八&#xff09;计算性能——多GPU训练前言计算性能——多GPU训练课件多GPU并行数据并行VS模型并行数据并行总结教材1 问题拆分2 数据并行性3 简单网络4 数据同步5 数据分发6 训练7 小结多GPU的简洁实现1简单网络2 网络初始化3 训练4 小结前言 核心…

因子特征工程:alphalens库深度解析

原创文章第107篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑&#xff0c; AI量化投资”。 前面的文章我们把数据&#xff0c;因子定制&#xff0c;自动标注的功能都准备好了&#xff0c;今天继续因子分析&#xff0c;分析的框架当然还是alphalens。 星球有一期研报…

Babel插件指南

Babel插件指南 文章目录Babel插件指南Babel简介AST(Abstract syntax tree)简介ESTree AST NodeVisitors&#xff08;访问者&#xff09;Babel APIbabylonbabel-traversebabel generator项目中实践引用自定义的babel插件新增插件js文件确定要实现的功能&#xff0c;编译成AST进行…

绘制花朵-第13届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第78讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

OpenYurt v1.1.0: 新增 DaemonSet 的 OTA 和 Auto 升级策略

作者&#xff1a;昌蒲、侯雪城 边缘计算云原生平台、CNCF SandBox 项目 - OpenYurt [1 ] &#xff0c;近期发布了 v1.1.0 版本。 OpenYurt 作为边缘云原生领域的开源项目&#xff0c;采用云管边的云边一体化架构&#xff0c;致力于解决云原生落地边缘计算场景的痛点问题。针对…

扩充antd的Icon图标库

一、功能介绍 项目中有个菜单图标支持配置的功能&#xff0c;如下 二、遇到的问题 上面的图标都是antdIcon组件自带的&#xff0c;只需要给Icon传不同的type就可以显示出来不同的图标&#xff0c;但是我现在需要将自己的图标也放到这个里面&#xff0c;而且实现通过传个type…

asp.net+sqlserver个人简历生成系统C#项目

目 录 1 项目来源 1 1.1 项目背景 1 1.2目的和意义 1 1.3研究成果 2 2 系统开发环境 3 2.1 Visual Studio.NET开发平台 3 2.2 ASP.NET 2.0开发技术 3 2.3 ADO.NET数据访问技术 4 2.4 Microsoft SQL Server简介 4 2.5 B/S结构 5 3 需求分析 6…

服务端Skynet(五)——如何搭建一个实例

服务端Skynet(五)——如何搭建一个实例 文章目录服务端Skynet(五)——如何搭建一个实例1、配置文件2、服务消息分发与回应(call/send)3、通信(server/client)4、Mysql连接1、配置文件 ​ 搭建一个实例 主要看 config 文件的设置&#xff0c;如下&#xff1a; --config inclu…

RK3399驱动开发 | 15 - RTC实时时钟芯片HYM8563S调试(基于linux5.4.32内核)

文章目录 一、Linux RTC设备驱动框架二、HYM8563实时时钟芯片1. 简介2. 引脚图3. 连接原理图三、设备驱动调试1. 设备树节点描述2. 使能内核驱动3. 测试四、hym8563驱动实现分析1. i2c设备驱动框架2. rtc设备注册流程3. 通过i2c驱动操作硬件一、Linux RTC设备驱动框架 Linux内…

宝塔防火墙必要的快速操作指令

重新启动、禁止固定ip等 重启firewall-cmd --reload 禁止固定ip&#xff1a;firewall-cmd --permanent --add-rich-rulerule family"ipv4" source address"192.168.1.1" reject 取消富规则&#xff1a;firewall-cmd --list-rich-rules 删除富规则&#…

Java#9(文字格斗游戏和对象数组练习)

目录 一.文字格斗游戏 二.对象数组 三.键盘录入练习 四.复杂对象数组练习 题目要求: 一.文字格斗游戏 Role类的代码 package Game;import java.util.Random;public class Role {String name;int blood;public Role() {}public Role(String name, int blood) {this.name na…

Node.js 流 Stream【详解】

什么是流&#xff1f; 流是一种将整体数据分割成多个小块依次进行处理的方式。 举个形象的例子&#xff1a; 山上有1000颗拳头大的小石子&#xff0c;需要搬下山。 传统的处理方式&#xff1a;安排一辆大卡车&#xff0c;一次性将石子全部运下山。流的处理方式&#xff1a;修…

Nginx制作下载站点

nginx使用的是模块ngx_http_autoindex_module来实现的&#xff0c;该模块处理以斜杠(“/”)结尾的请求&#xff0c;并生成目录列表。 nginx编译的时候会自动加载该模块&#xff0c;但是该模块默认是关闭的&#xff0c;使用下来指令来完成对应的配置 autoindex 启用或禁用目录…

医疗器械许可证怎么办理

医疗器械经营许可证申请条件 1.有两个与业务规模和业务范围相适应的质量管理机构或大专以上学历的质量管理人员。质量管理人员应具有国家认可的相关专业资格或职称&#xff1b; 2.具有与经营规模和范围相适应的相对独立的经营场所&#xff1b; 3.具备与经营规模和经营范围相…

解读OpenShift的逻辑架构和技术架构

01 OpenShift的逻辑架构 OpenShift的逻辑架构图如图2-6所示。 ▲图2-6 OpenShift逻辑架构 图2-6中的关键组件介绍如下。 底层基础设施:OpenShift可以运行在公有云(AWS、Azure、Google等)、私有云(OpenStack)、虚拟机(vSphere、RHV、红帽KVM)、X86、IBM Power/Z服务器上。…

跨域及cors解决跨域

1.什么是跨域 出于浏览器的同源策略限制。同源策略&#xff08;Sameoriginpolicy&#xff09;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;如果缺少了同源策略&#xff0c;则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的…