SpringBoot(容器功能)

文章目录

    • 1.@Configuration 添加/注入bean
        • 1.注入bean
          • 1.编写一个JavaBean,Monster.java
          • 2.创建一个config文件夹(名字任意),用于存放配置Bean的类(相当于配置文件)
          • 3.BeanConfig.java
          • 4.测试使用 MainApp.java
          • 2.结果展示
        • 2.细节说明
          • 1.@Configuration的proxyBeanMethods属性
          • 2.可以有多个配置类但是注入bean的id不能相同
            • 1.新建一个BeanConfig01.java作为第二个配置类,故意和第一个配置类注入的bean的id相同
            • 2.会报错
            • 3.修改一下这个bean的id
            • 4.MainApp.java获取这两个bean
            • 5.成功获取不同配置类注入的bean
    • 2.@Import 注入bean
        • 1.新建两个空的bean,Dog和Cat
        • 2.配置类中使用注解注入单例bean,id为全类名
        • 3.MainApp.java 获取两个bean对象
        • 4.结果展示
          • 1.成功得到两个bean对象
          • 2.id为全类名
    • 3.@Conditional 条件装配
        • 1.基本介绍
          • 1.介绍
          • 2.扩展注解功能
        • 2.应用实例1:@ConditionalOnBean
          • 1.需求分析
          • 2.新建一个配置类 ConditionalConfig.java 用于测试条件装配
          • 3.测试获取cat_boy
          • 4.结果展示
        • 3.应用实例2:@ConditionalOnMissingBean
          • 1.需求分析
          • 2.ConditionalConfig.java 添加方法
          • 3.测试获取cat_boy2
          • 4.结果展示
        • 4.条件装配注解可以放在类型上
    • 4.@ImportResource 原生配置文件引入
        • 1.基本介绍
        • 2.应用实例
          • 1.需求分析
          • 2.新建一个 BeanConfig02.java 用于测试
          • 3.类路径下编写一个beans.xml
          • 4.MainApp.java 使用SpringBoot的ioc来获取bean
          • 5.成功获取

1.@Configuration 添加/注入bean

1.注入bean
1.编写一个JavaBean,Monster.java
package com.sun.springboot.bean;/*** @author 孙显圣* @version 1.0*/
public class Monster {private Integer id;private String name;private Integer age;private String skill;public Monster() {}public Monster(Integer id, String name, Integer age, String skill) {this.id = id;this.name = name;this.age = age;this.skill = skill;}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;}@Overridepublic String toString() {return "Monster{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", skill='" + skill + '\'' +'}';}
}
2.创建一个config文件夹(名字任意),用于存放配置Bean的类(相当于配置文件)

image-20240312154505906

3.BeanConfig.java
package com.sun.springboot.config1;import com.sun.springboot.bean.Monster;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;/*** @author 孙显圣* @version 1.0*/
@Configuration //这个注解类似于原来的配置文件
public class BeanConfig {/*** 类型:Monster* id:monster01, 如果想要指定id,只需设置@Bean的name属性* 单例bean注入容器:return new Monster()* @return*/@Bean
//    @Scope("prototype") //默认是单例的如果希望是多例的,则加一个注解即可。public Monster monster01() {return new Monster(1, "牛魔王", 12, "牛牛冲撞");}
}
4.测试使用 MainApp.java
package com.sun.springboot;import com.sun.springboot.bean.Monster;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;/*** @author 孙显圣* @version 1.0*/
//表示是一个springboot项目
@SpringBootApplication(scanBasePackages = {"com.sun"}) //扫描指定的包,参数是数组类型的
public class MainApp {public static void main(String[] args) {//启动springbootConfigurableApplicationContext ioc = SpringApplication.run(MainApp.class, args);//由于是单例所以可以通过类型来获取Monster bean = ioc.getBean(Monster.class);System.out.println(bean);}
}
2.结果展示

image-20240312155648547

2.细节说明
1.@Configuration的proxyBeanMethods属性

image-20240312161624699

2.可以有多个配置类但是注入bean的id不能相同
1.新建一个BeanConfig01.java作为第二个配置类,故意和第一个配置类注入的bean的id相同
package com.sun.springboot.config1;import com.sun.springboot.bean.Monster;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author 孙显圣* @version 1.0*///这是第二个bean配置文件
@Configuration
public class BeanConfig01 {@Beanpublic Monster monster01() {return new Monster(1, "牛魔王", 12, "牛牛冲撞");}
}
2.会报错

image-20240312163158508

3.修改一下这个bean的id

image-20240312163306024

4.MainApp.java获取这两个bean
package com.sun.springboot;import com.sun.springboot.bean.Monster;
import com.sun.springboot.config1.BeanConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;/*** @author 孙显圣* @version 1.0*/
//表示是一个springboot项目
@SpringBootApplication(scanBasePackages = {"com.sun"}) //扫描指定的包,参数是数组类型的
public class MainApp {public static void main(String[] args) {//启动springbootConfigurableApplicationContext ioc = SpringApplication.run(MainApp.class, args);//获取第一个beanMonster bean1 = ioc.getBean("monster01", Monster.class);//获取第二个beanMonster bean2 = ioc.getBean("monster02", Monster.class);System.out.println(bean1);System.out.println(bean2);}
}
5.成功获取不同配置类注入的bean

image-20240312163634634

2.@Import 注入bean

1.新建两个空的bean,Dog和Cat

image-20240312164449942

2.配置类中使用注解注入单例bean,id为全类名

image-20240312164601651

3.MainApp.java 获取两个bean对象
package com.sun.springboot;import com.sun.springboot.bean.Cat;
import com.sun.springboot.bean.Dog;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;/*** @author 孙显圣* @version 1.0*/
//表示是一个springboot项目
@SpringBootApplication(scanBasePackages = {"com.sun"}) //扫描指定的包,参数是数组类型的
public class MainApp {public static void main(String[] args) {//启动springbootConfigurableApplicationContext ioc = SpringApplication.run(MainApp.class, args);Cat cat = ioc.getBean(Cat.class);Dog dog = ioc.getBean(Dog.class);System.out.println(cat);System.out.println(dog);}
}
4.结果展示
1.成功得到两个bean对象

image-20240312164824082

2.id为全类名

image-20240312164235674

3.@Conditional 条件装配

1.基本介绍
1.介绍

image-20240312165406408

2.扩展注解功能

image-20240312165601514

2.应用实例1:@ConditionalOnBean
1.需求分析

image-20240312165643503

2.新建一个配置类 ConditionalConfig.java 用于测试条件装配
package com.sun.springboot.config1;import com.sun.springboot.bean.Cat;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author 孙显圣* @version 1.0*/
//测试条件装配@Configuration
public class ConditionalConfig {//这里注入一个猫girl@Bean(name = "cat_girl")public Cat cat() {return new Cat();}@Bean@ConditionalOnBean(name = "cat_girl") //注入一个猫boy,条件是有一个猫girlpublic Cat cat_boy() {return new Cat();}
}
3.测试获取cat_boy
package com.sun.springboot;import com.sun.springboot.bean.Cat;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;/*** @author 孙显圣* @version 1.0*/
//表示是一个springboot项目
@SpringBootApplication(scanBasePackages = {"com.sun"}) //扫描指定的包,参数是数组类型的
public class MainApp {public static void main(String[] args) {//启动springbootConfigurableApplicationContext ioc = SpringApplication.run(MainApp.class, args);//获取cat_boyCat cat = ioc.getBean("cat_boy", Cat.class);System.out.println(cat);}
}
4.结果展示

image-20240312171954391

3.应用实例2:@ConditionalOnMissingBean
1.需求分析

注入一个猫boy,条件是没有一个猫girl

2.ConditionalConfig.java 添加方法
    @Bean@ConditionalOnMissingBean(name = "cat_girl") //注入一个猫boy,条件是没有一个猫girlpublic Cat cat_boy2() {return new Cat();}
3.测试获取cat_boy2
package com.sun.springboot;import com.sun.springboot.bean.Cat;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;/*** @author 孙显圣* @version 1.0*/
//表示是一个springboot项目
@SpringBootApplication(scanBasePackages = {"com.sun"}) //扫描指定的包,参数是数组类型的
public class MainApp {public static void main(String[] args) {//启动springbootConfigurableApplicationContext ioc = SpringApplication.run(MainApp.class, args);//获取cat_boy2Cat cat_boy2 = ioc.getBean("cat_boy2", Cat.class);System.out.println(cat_boy2);}
}
4.结果展示

image-20240312172659292

4.条件装配注解可以放在类型上

image-20240312172847245

4.@ImportResource 原生配置文件引入

1.基本介绍

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.应用实例
1.需求分析

image-20240312173233260

2.新建一个 BeanConfig02.java 用于测试
package com.sun.springboot.config1;import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;/*** @author 孙显圣* @version 1.0*/
@Configuration
//通过类路径来读取beans.xml文件,引入bean到这个配置类,然后就可以通过SpringBoot的ioc来获取bean
//注意这个注解的属性可以是value也可以是locations,而value属性是可以不写属性名的
@ImportResource(locations = "classpath:beans.xml")
public class BeanConfig02 {}
3.类路径下编写一个beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.sun.springboot.bean.Monster" id="monsterByImport"><property name="id" value="1"/><property name="skill" value="1"/><property name="name" value="1"/><property name="age" value="1"/>
</bean>
</beans>
4.MainApp.java 使用SpringBoot的ioc来获取bean
package com.sun.springboot;import com.sun.springboot.bean.Cat;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;/*** @author 孙显圣* @version 1.0*/
//表示是一个springboot项目
@SpringBootApplication(scanBasePackages = {"com.sun"}) //扫描指定的包,参数是数组类型的
public class MainApp {public static void main(String[] args) {//启动springbootConfigurableApplicationContext ioc = SpringApplication.run(MainApp.class, args);//获取从beans.xml中导入到SpringBoot中的ioc容器中Object bean = ioc.getBean("monsterByImport");System.out.println(bean);}
}
5.成功获取

image-20240312174414367

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过Office Web Viewer站点在线展示Office文档内容

方法&#xff1a; https://view.officeapps.live.com/op/view.aspx?src经Url编码的文档线上Url地址 比如&#xff1a; //以下地址来自一份旧项目代码&#xff0c;可见用的就是该方案function OfficeFileViewOnline(url, file_type, file_name) {url "http://14.23.112.2…

RPC通信原理

RPC通信原理 RPC的概念 如果现在我有一个电商项目&#xff0c;用户要查询订单&#xff0c;自然而然是通过Service接口来调用订单的实现类。 我们把用户模块和订单模块都放在一起&#xff0c;打包成一个war包&#xff0c;然后再tomcat上运行&#xff0c;tomcat占有一个进程&am…

用chatgpt写论文重复率高吗?如何降低重复率?

ChatGPT写的论文重复率很低 ChatGPT写作是基于已有的语料库和文献进行训练的&#xff0c;因此在写作过程中会不可避免地引用或借鉴已有的研究成果和观点。同时&#xff0c;由于ChatGPT的表述方式和写作风格与人类存在一定的差异&#xff0c;也可能会导致论文与其他文章相似度高…

扩展学习|系统理解数字经济

文献来源&#xff1a;[1]肖静华,胡杨颂,吴瑶.成长品&#xff1a;数据驱动的企业与用户互动创新案例研究[J].管理世界,2020,36(03):183-205.DOI:10.19744/j.cnki.11-1235/f.2020.0041. [2]陈晓红,李杨扬,宋丽洁等.数字经济理论体系与研究展望[J].管理世界,2022,38(02):208-22413…

力扣面试经典150 —— 11-15题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题&#xff0c;安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题&#xff0c;文中 “数组” 通常指 python 列表&#xff1b;文中 “指针” 通常指 python 列表索引 文章目录 11. [中等] H指…

YOLOv9改进 添加三分支注意力机制TripletAttention

一、TripletAttention论文 论文地址: 2010.03045.pdf (arxiv.org) 二、TripletAttention结构 对于输入张量,TripletAttention通过旋转操作和残差变换建立维度间依赖关系,并以可忽略的计算开销对通道间和空间信息进行编码。TripletAttention通过几乎无参数的特点来建模通道…

qt如何配置ros环境

在Qt5.7的版本可以使用bash -i -c来启动qt&#xff0c;让Qt自己识别系统环境&#xff0c;不知道为什么Qt在之后的版本&#xff0c;这样使用都失效了。因为它会默认把CMAKE_PREFIX_PATH修改掉。 网上还有安装ros插件版本的qt creator&#xff0c;感觉失去了一些灵活性。 自己测试…

数据结构 第1章:绪论

文章目录 1. 绪论1.1. 数据结构 1.2. 算法1.2.1. 算法的基本概念1.2.2. 算法的时间复杂度1.2.3. 算法的空间复杂度 1. 绪论 程序 数据结构 算法 1.1. 数据结构 数据&#xff1a;是对客观事物的符号表示&#xff0c;在计算机科学中是指所有能输入到计算机中并被计算机程序处理…

Python: 如何绘制核密度散点图和箱线图?

01 数据样式 这是数据样式&#xff1a; 要求&#xff08;我就懒得再复述一遍了&#xff0c;直接贴图&#xff09;&#xff1a; Note&#xff1a;数据中存在无效值NA&#xff08;包括后续的DEM&#xff09;&#xff0c;需要注意 02 提取DEM 这里我就使用gdal去提取一下DEM列…

深度学习图像算法工程师--面试准备(2)

深度学习面试准备 深度学习图像算法工程师–面试准备&#xff08;1&#xff09; 深度学习图像算法工程师–面试准备&#xff08;2&#xff09; 文章目录 深度学习面试准备前言一、Batch Normalization(批归一化)1.1 具体步骤1.2 BN一般用在网络的哪个部分 二、Layer Normaliza…

CTP-API开发系列之八:报撤单代码实现

CTP-API开发系列之八&#xff1a;报撤单代码实现 CTP-API开发系列之八&#xff1a;报撤单代码实现前情回顾函数实现缓存FrontID 和 SessionID报单函数实现撤单函数实现 调用示例报单&#xff08;形成挂单&#xff09;对挂单进行撤单报单&#xff08;立即成交&#xff09;注意事…

XSS靶场-DOM型初级关卡

一、环境 XSS靶场 二、闯关 1、第一关 先看源码 使用DOM型&#xff0c;获取h2标签&#xff0c;使用innerHTML将内容插入到h2中 我们直接插入<script>标签试一下 明显插入到h2标签中了&#xff0c;为什么不显示呢&#xff1f;看一下官方文档 尽管插入进去了&#xff0…

系统运维网络知识汇总

一、系统运维中网络方面的规划与思考 系统运维建立在网络的基础之上&#xff0c;如果没有一个相对合理的网络架构&#xff0c;恐怕系统运维做起来也不是那么的顺手。一个公司基本上都会把网络和服务器独立开来&#xff0c;划分不同的区域摆放设备&#xff0c;很多时候都是物理…

基于Android的高校移动成绩查询系统的设计与实现

摘 要 在我国现今状态&#xff0c;互联网呈现出的高速发展状态以及高等教育的教学不断改革下&#xff0c;各高校的教务管理系统都已经从传统的纸质方式转向了基于Internet的绿色管理方式。而对于目前各高校所使用的都是浏览器/服务器&#xff08;B/S&#xff09;模式&#xff…

短视频解析接口分发系统,附带系统搭建教程

搭建教程 宝塔面板&#xff1a;Nginx系统 php7.2 Mysql 5.6-5.7 伪静态Thinkphp 上传文件直接访问域名安装即可 解析接口推荐&#xff1a;ce.qsy.mobi 源码免费下载地址抄笔记

JavaSE面试——类集框架List/Set/Queue

Collection 集成体系 Map 集成体系 List 和 Map、Set 的区别 1. 结构特点 1.存储数据类型&#xff1a; List 和 Set 是存储单列数据的集合&#xff0c;Map 是存储键和值这样双列数据的集合 2. 存储特点&#xff1a; List&#xff1a;存储数据有顺序&#xff0c;允许重复 …

kibana配置 dashbord,做可视化展示

一、环境介绍 这里我使用的kibana版本为7.17版本。 语言选择为中文。 需要已经有es&#xff0c;已经有kibana&#xff0c;并且都能正常访问。 二、背景介绍 kibana的可视化界面&#xff0c;可以配置很多监控统计界面。非常方便&#xff0c;做数据的可视化展示。 这篇文章&…

鸿蒙App基础

基础说明 .1、应用模型 .1.1、构成要素 应用组件 应用组件是应用的基本组成单位&#xff0c;是应用的运行入口。用户启动、使用和退出应用过程中&#xff0c;应用组件会在不同的状态间切换&#xff0c;这些状态称为应用组件的生命周期。应用组件提供生命周期的回调函数&…

Android 生成SO - 基础工程创建

最近需要给小伙伴扫盲一下如何使用Android Studio 生成一个SO文件&#xff0c;网上找了很多都没有合适的样例&#xff0c;那只能自己来写一个了。 原先生成SO是一个很麻烦的事情&#xff0c;现在Android Studio帮忙做了很多的事情&#xff0c;基本只要管好自己的C代码即可。 …

数据“隐领”未来!【隐私计算实训营】限时免费招募!

数智经济时代&#xff0c;为强化个人隐私信息保护&#xff0c;国家颁布了《国家安全法》、《网络安全法》、《数据安全法》等数据安全法律法规&#xff0c;并严厉处罚数据违规出海、侵权、滥用等问题。数据安全和隐私保护成为大家的共识。隐私计算技术在此背景下应运而生&#…