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.mzph.cn/news/747464.shtml

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

相关文章

Regex正则表达式 --java学习笔记

正则表达式 由一些特定字符组成&#xff0c;代表的是一个规则作用一&#xff1a;校验数据格式是否合法作用二&#xff1a;在一段文本中查找满足要求的内容 String提供了一个匹配正则表达式的方法 public boolean matches&#xff08;String regex&#xff08;正则表达式&…

Delft3D建模、水动力模拟方法及在地表水环境影响评价中的技术应用

​任博士&#xff0c;长期从事地表水数值模拟研究与实践工作&#xff0c;具有资深的技术底蕴和专业背景。 1、掌握Delft3D的建模流程&#xff0c;包括基础数据的准备、计算网格的制作、模型的调试与率定、计算结果的处理等&#xff0c;熟悉软件的基本操作。 2、熟悉Delft3D网…

18个惊艳的可视化大屏(第24辑):通讯行业的应用

实时监控&#xff1a; 可视化大屏可以实时监控通讯网络的运行状态和性能指标。通过可视化展示网络的拓扑结构、设备状态、带宽利用率、延迟等数据&#xff0c;运维人员可以及时发现和解决网络故障&#xff0c;保障通讯网络的稳定性和可靠性。 故障诊断与分析&#xff1a; 可视…

YOLOv8 | 有效涨点,添加GAM注意力机制,使用Wise-IoU有效提升目标检测效果(附报错解决技巧,全网独家)

目录 摘要 基本原理 通道注意力机制 空间注意力机制 GAM代码实现 Wise-IoU WIoU代码实现 yaml文件编写 完整代码分享&#xff08;含多种注意力机制&#xff09; 摘要 人们已经研究了各种注意力机制来提高各种计算机视觉任务的性能。然而&#xff0c;现有方法忽视了…

C语言例3-20:使用逻辑运算符的例子

代码如下&#xff1a; #include<stdio.h> int main(void) {int x3, y100;float f11.0f, f22.1f;char cd; //d(100)printf("!x 的值为&#xff1a; %d\n",!x); //0printf("x||y 的值为&#xff1a; %d\n",x||y); //1print…

ai怎么制作ppt?保姆级的ai一键生成ppt教程来了!

面对市面上多如牛毛的 ai 生成 ppt 软件&#xff0c;哪一款更适合日常使用呢&#xff1f;与此同时&#xff0c;在选定一款 ai 软件后&#xff0c;如何用 ai 制作 ppt&#xff0c;也是很多人第一次使用 pptai 工具会面临的具体问题。 就着这些问题&#xff0c;在接下来的文章中…

有哪些便宜的通配符(泛域名)证书?怎么申请?

通配符&#xff08;泛域名&#xff09;SSL证书就是用来保护一个主域名以及所有二级子域名的证书&#xff0c;相对于单域名证书更具有性价比。 主要优势在于&#xff1a; 一&#xff1a;一个整数覆盖所有子域名 仅仅用一张证书就可以保护一个主域名以及所有子域名&#xff0c;…

HPA数据库及HPAanalyze包使用

关于HPA数据库的介绍&#xff1a;Human Protein Atlas 数据库 – 王进的个人网站 (jingege.wang) The Human Protein Atlas 文献 HPAanalyze: an R package that facilitates the retrieval and analysis of the Human Protein Atlas data | BMC Bioinformatics | Full Text …

【PPO】近端策略优化【Clip版本,离散动作】

本博客代码参考了《动手学强化学习-PPO》 PPO算法是在Actor-Critic的基础上进行训练目标的调整。其改进的地方在于对每次参数更新进行了限制。 PPO 是 TRPO 的一种改进算法&#xff0c;它在实现上简化了 TRPO 中的复杂计算&#xff0c;并且它在实验中的性能大多数情况下会比 …

服务模块划分规范

一、PO :(persistant object )&#xff0c;持久对象 可以看成是与数据库中的表相映射的java对象。使用Hibernate来生成PO是不错的选择。 二、VO :(value object) &#xff0c;值对象 通常用于业务层之间的数据传递&#xff0c;和PO一样也是仅仅包含数据而已。但应是抽象出的…

功能问题:如何用Docker部署一个后端项目?

大家好&#xff0c;我是大澈&#xff01; 本文约1800字&#xff0c;整篇阅读大约需要3分钟。 关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费加入问答群&#xff0c;一起交流技术难题与未来&#xff01; 现在关注公众号&#xff0c;免费送你 ”前后端入行大礼包…

SwiftU的组件 - TabView

SwiftU的组件 - TabView 记录一下SwiftU的组件 - TabView的两种style分别的使用方式 import SwiftUIstruct TabViewBootCamp: View {State var selectedIndex 0var body: some View {NavigationView {TabView(selection: $selectedIndex) {HomeView(selectedIndex: $selected…

基于python的《彩图版飞机大战》程序使用说明(附源码下载)

在PyCharm中运行《彩图版飞机大战》即可进入如图1所示的游戏界面。 图1 游戏主界面 具体的操作步骤如下&#xff1a; &#xff08;1&#xff09;玩游戏。在游戏主界面中&#xff0c;从屏幕的顶部不断出现下落的敌机&#xff0c;玩家按下键盘上的↑、↓、←、→方向键移动飞机…

Android 深入Http(2)加密与编码

可以对二进制数据&#xff08;比如图片、视频&#xff09; 经典算法&#xff1a; DES&#xff08;密钥短被弃用了&#xff09; AES &#xff08;密钥很长 很顶&#xff09; 速度快&#xff0c;效率高 IDEA 3DES&#xff08;三重DES&#xff0c;听起来就很慢和重 &#xf…

VGG论文学习笔记

题目&#xff1a;VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION 论文下载地址&#xff1a;VGG论文 摘要 目的&#xff1a;研究深度对精度的影响 方法&#xff1a;使用3*3滤波器不断增加深度&#xff0c;16和19效果显著 成绩&#xff1a;在ImageNet 20…

搭建知识管理系统并不复杂,这篇教程来帮你

许多人都有这样的体验&#xff1a;我们抓住的想法和知识总在不经意间溜走&#xff0c;我们想要的信息总是一时无法找到。因此&#xff0c;搭建一个能够系统化、分类和索引存储这些知识的“知识管理系统”是必要的。听上去很专业&#xff0c;其实并不复杂&#xff0c;让我们一步…

mysql: 如何开启慢查询日志?

1 确认慢查询日志功能已开启 执行以下sql语句&#xff0c;查看慢查询功能是否开启&#xff1a; show VARIABLES like slow_query_log;如果为ON&#xff0c;表示打开&#xff1b;如果为OFF&#xff0c;表示没有打开&#xff0c;需要开启慢查询功能。 执行以下sql语句&#xff0…

修改 MySQL update_time 默认值的坑

由于按规范需要对 update_time 字段需要对它做默认值的设置 现在有一个原始的表是这样的 CREATE TABLE test_up (id bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 主键id,update_time datetime default null COMMENT 操作时间,PRIMARY KEY (id) ) ENGINEInnoDB DEF…

MapStruct代替BeanUtils.copyProperties ()使用

1.为什么MapStruct代替BeanUtils.copyProperties () 第一&#xff1a;因为BeanUtils 采用反射的机制动态去进行拷贝映射&#xff0c;特别是Apache的BeanUtils的性能很差&#xff0c;而且并不支持所有数据类型的拷贝&#xff0c;虽然使用较为方便&#xff0c;但是强烈不建议使用…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:NavRouter)

导航组件&#xff0c;默认提供点击响应处理&#xff0c;不需要开发者自定义点击事件逻辑。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 必须包含两个子组件&#xff0c;其中第二个子组…