Spring Boot之容器功能

2023-11-02

目录

一.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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot之容器功能 的相关文章

  • 带有 Spring RequestMapping 路径参数的编码斜杠 (%2F) 给出 HTTP 400

    这不是重复的参考问题 https stackoverflow com questions 3235219 因为它是 Spring 特有的 无论谁添加了这个 事实发生三年后 都没有费心去阅读问题或评论线程来看看真正的答案是什么 接受的答案并不
  • Android 服务 START_STICKY START_NOT_STICKY

    我需要让我的服务始终在后台运行 并使用 startService 函数启动我的服务 无论应用程序的状态如何 我都不想重新启动服务 这是我的观察 START STICKY gt 如果应用程序启动 则服务正在重新启动 当应用程序关闭时 服务也会
  • 在 Java 中将字符串复制到文件的开头

    我想将一个字符串写入文件的开头 我该怎么做 我根本不知道如何添加字符串 这就是我到目前为止所做的 public static void prepend String filename String data throws IOExcepti
  • 获取文本文件中行的字节偏移量?

    我有一个文本文件 例如 one two three four five 我需要获取文件中每一行的偏移量 我如何在 Java 中做到这一点 我搜索了一些 I O 库 如 BufferedReader 和 RandomAccessFile 但我
  • rmi类找不到异常

    我使用 java rmi 编写了一个简单的项目并导出到可执行 jar 文件 当我尝试运行它时 有时会出现异常 有时会起作用 当我指定 Djava rmi server codebase file serverClasses 时 它似乎没有正
  • 当Java中set已经是原子的时候,为什么我们还需要compareAndSet呢?

    因为原子意味着线程安全 当 set 本身在java中是原子和线程安全的时候 我们什么时候使用compareAndSet 举例来说 我想以原子方式设置一个变量 以便每个其他线程都可以看到它 但我希望以线程安全的方式设置该变量 我可以简单地将其
  • JAVA 签名对象 - 没有安装的提供程序支持此密钥:sun.security.rsa.RSAPrivateCrtKeyImpl

    我想使用密钥工具和以下命令创建的一对 RSA 密钥对我创建的文件进行签名 keytool genkeypair alias key keyalg RSA keysize 2048 sigalg SHA256withRSA validity
  • 如何修复运行 Android 模拟器时出现 GPU Driver Issue 错误

    我的 Android 模拟器几周前运行良好 但现在出现错误 当我运行代码时 GPU 驱动程序问题错误对话框与模拟器一起弹出 当我单击 确定 时 Android 模拟器不会按预期运行应用程序 错误如下 Your GPU driver info
  • 具有多个字符串的列表视图

    我正在尝试创建一个包含多个字符串的列表视图 现在我有一个可以实现的功能 while i lt 10 GETS DATA FROM WEBPAGE ETC a DATAFROMWEBPAGE1 b DATAFROMWEBPAGE2 c DAT
  • 为什么在大多数开源java项目中局部变量没有被声明为final?

    如果我查看 OpenJDK Hibernate 或 Apache 中的 java 源代码 我还没有看到任何声明为 Final 的局部变量 这表明一些最广泛使用的 java 软件库的开发人员 不要相信final关键字可以提高可读性 不相信它会
  • CompletableFuture SupplyAsync

    我刚刚开始探索 Java 8 的一些并发特性 让我有点困惑的一件事是这两个静态方法 CompletableFuture
  • Apache Camel - 路由中的事务

    我有一个关于 Apache Camel 的一般性问题 我无法找到聚合器是否已进行交易 如果是交易 交易是如何实现的 聚合的速度有多快 将消息发送到聚合器可以在事务中运行 您需要一个带有聚合器的持久存储来让传出消息充当事务 请参阅有关持久性的
  • 使用会话空闲超时进行轮询

    我对 Tomcat 中的所有应用程序使用单点登录 我的要求是 我必须轮询应从后端获取的事务状态 但它也不应该影响会话的空闲超时 有人可以建议是否可以做点什么吗 Thanx 我不知道是否有标准方法可以做到这一点 如果没有 你可以写一个过滤器
  • CDI Bean 访问 Spring bean?

    我知道这听起来很奇怪 将 CDI 焊接 和 Spring 混合用于控制器 但想象一下这种情况 有了CDI 我可以利用 ConversationScoped 这是我的要求之一 到目前为止我不知道我是否可以在这种范围内使用spring 因为如果
  • 尝试用Java实现基于文本的Hangman游戏

    我需要检查用户输入的字母以及他们猜测的空格是否位于隐藏单词的特定位置 变量one等于用户猜测的空间索引 而letterGuess是他们猜测的字母 我的代码怎么错了 示例 秘密词是你好 hidden word is 用户猜测h 0 1 2 3
  • 如何根据受保护的 String doInBackground 方法中 AsyncTask 的结果调用 Toast.makeText() ?

    我从 AsyncTask 中的数据库中获取数据 如果它为空 我想吐司一个警告文本 我在 AsyncTask 中尝试过 但我了解到它不是在工作线程中调用的 这是我的 doInBackground 方法 protected String doI
  • Java:易失性足以使类线程安全?

    我有一个关于 Java 中 volatile 语句的问题 请看这个构造的例子 class Master Foo is a class with thread safe methods public volatile Foo foo clas
  • 如何使用现代.fxml和controller.java在javafx 2.x中制作自动完成组合框[重复]

    这个问题在这里已经有答案了 如何使用现代 fxml 和controller java 在 javafx 2 x 中制作一个类似的自动完成组合框 就像制作这个一样 http blog ngopal com np 2011 07 04 auto
  • 在地图中的图块上实现鼠标单击事件

    我正在尝试在 JPanel 上实现图像 基本上是地图上的图块 的鼠标单击事件 我只是不知道该怎么做 我有一个扩展 JPanel 的 Main 类 我正在从图块服务器检索图块 并根据特定的缩放级别在 Main 类的 PaintComponen
  • 如何读取FTL文件中的JSONArray?

    我在我的 Java 文件中硬编码了以下 JSON 对象 JSONObject notificationInfoJson new JSONObject notificationInfoJson put title Payment Receiv

随机推荐

  • Excel处理数据的常用函数整理

    1 常用函数 2 常见数学和三角函数 excel求逆矩阵的例子 3 统计函数
  • 【代码】CenterNet使用(Detection)(demo.py)

    一 运行demo py 按照readme里头的创建一个新环境 按照要求安装即可 中间也遇到了不少的问题 比如说一开始装上了torch0 4 1 之后不能安装torchvision 所以又升到了torch1 0 安装完torchvison之后
  • BP神经网络样本数多少有什么影响 ?

    BP神经网络样本数有什么影响 学习神经网络这段时间 有一个疑问 BP神经网络中训练的次数指的网络的迭代次数 如果有a个样本 每个样本训练次数n 则网络一共迭代an次 在n gt gt a 情况下 网络在不停的调整权值 减小误差 跟样本数似乎
  • 第一次接私活 && 第一次做微信小程序

    第一次接私活 第一次做微信小程序 文章目录 技术篇 真的很简单 控制size 注意原生组件和微信组件的差别 wx nextTick 不可信 感触篇 职场口碑很重要 及时 主动上报进度 不要高估自己的能力 先想后做 前段时间 经由前同事们介绍
  • Open3D (C++) 点云按高程进行赋色

    目录 一 概述 二 代码实现 三 结果展示 一 概述 直接调用Open3D中的颜色渲染函数根据点云的高程信息为点云中的每个点附上颜色 并保存颜色渲染结果至 pcd文件 二 代码实现 include
  • 运维——centos 7 systemctl用法

    特别声明 以下的所有例子均在centos7版本下实现 Systemd 系统启动和服务器守护进程管理器 负责在系统启动或运行时 激活系统资源 服务器进 程和其它进程 新特性 系统引导时实现服务并行启动 按需启动守护进程 自动化的服务依赖关系管
  • Windows+Nvdia显卡配置Tensorflow

    这篇其实算是自己的笔记 因为配置Tensorflow的过程有点多又记不住 免的每次都搜了 索性记录下来 如标题所示为了完成配置工作首先得是windows 其次得有Nvdia显卡 接着就可以开工了 哦 对 python也得有吧 我一直用的3
  • Elasticsearch专栏-2.es环境安装

    es部署安装 安装说明 单机部署 解压安装 添加es专用用户 修改配置文件 修改系统配置 关闭防火墙 或放行9200端口 切换用户 后台启动 集群部署 集群部署说明 在一台机器上 在三台机器上 kibana部署 解压安装 修改配置文件 切换
  • Python绘制时序图、自相关图和偏自相关图。

    import pandas as pd import matplotlib pyplot as plt import seaborn as sns import statsmodels api as sm sns set theme 设置风
  • Vue学习第三天(axios和动画效果)

    Vue学习第三天 axios和动画效果 在学习视频中 老师演示使用vue resource 但是由于vue resource已经停止升级 我们使用axios完成ajax操作 官方文档的一堆介绍可以自行百度 下面我们介绍它的简单使用 使用方法
  • 程序员们,千万不要接私活!

    点击上方 程序员小灰 选择 置顶公众号 有趣有内涵的文章第一时间送达 本文转载自公众号 前端你别闹 这个话题很纠结 现在社会 有很多人都在利用个人时间兼职赚钱 程序员俗称 接私活 其他行业称作兼职 比如下了班出去跑滴滴 周末兼职抢单送外卖等
  • Hive窗口函数全解

    在SQL中有一类函数叫做聚合函数 例如sum avg max 等等 这类函数可以将多行数据按照规则聚集为一行 一般来讲聚集后的行数是要少于聚集前的行数的 但是有时我们想要既显示聚集前的数据 又要显示聚集后的数据 这时我们便引入了窗口函数 窗
  • JdbcTemplate、JPA和MyBatis效率还是易用,你说了算

    鱼与熊掌不可得兼 你若属于我 那就只属于我一个人 我可不喜欢和别人分享 在Spring Boot中 JdbcTemplate JPA和MyBatis是三个常用的数据库层操作方式 每种方法都有其优缺点 而它们在执行效率上的差异主要取决于应用场
  • AD如何修改PCB文件的黑色编辑区

    记录一个日常小方法 不断的学习 不断的积累 AD版本也在不断的更新换代 本次主要介绍AD9和AD14 AD9修改黑色编辑区大小 首先打开PCB文档 点击design Board shape Redefine board shape 点击完之
  • 百度地图开放平台使用 JavaScript API 和 在Vue中使用

    常见使用 百度地图开放平台 JavaScriptAPI 文档 https lbs baidu com index php title jspopularGL guide helloworld 基本使用 在控制台里创建一个应用 注意应用类型填
  • NVIDIA GeForce Experience登录报错:验证程序加载失败,请检查您的浏览器设置,例如广告拦截程序(解决办法)

    NVIDIA GeForce Experience登录报错 验证程序加载失败 请检查您的浏览器设置 例如广告拦截程序 解决办法 解决结果 点击驱动程序进行检查跟新 解决问题办法 1 打开控制面板 选择 网络和共享中心 2 选择 更改适配器设
  • deque用法详解

    无意中发现了一个巨牛的人工智能教程 忍不住分享一下给大家 教程不仅是零基础 通俗易懂 而且非常风趣幽默 像看小说一样 觉得太牛了 所以分享给大家 点这里可以跳转到教程 deque函数 deque容器为一个给定类型的元素进行线性处理 像向量一
  • 编译安装Nginx

    安装make yum y install gcc automake autoconf libtool make 安装g yum y install gcc gcc c PCRE库 Nginx需要PCRE Perl Compatible Re
  • Dotween运动曲线与路径动画

    Dotween运动曲线与路径动画 Dotween 运动曲线 内置的运动曲线 AnimationCurve Dotween 路径动画 一 设置一个数组存放位置坐标 二 直接写出自己想要到的坐标 Dotween 运动曲线 想要理解Dotwenn
  • Spring Boot之容器功能

    目录 一 Spring 注入组件的注解 二 Configuration 1 代码演示 1 1JavaBean Monster java 1 2配置类 1 3执行代码 2 Configuration 注意事项和细节 三 Import 1 创建