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.hqwc.cn/news/541628.html

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

相关文章

PTA题解 --- N个数求和(C语言)

今天是PTA题库解法讲解的第二天&#xff0c;今天我们要讲解N个数求和&#xff0c;题目如下&#xff1a; 要解决这个问题&#xff0c;我们可以用C语言编写一个程序来处理和简化分数。程序的基本思路如下&#xff1a; 1. 定义一个函数来计算两个数的最大公约数&#xff08;GCD&a…

图论:DFS与BFS

目录 1.DFS&#xff08;图论&#xff09; 1.1.DFS过程 1.2.应用 2.BFS&#xff08;图论&#xff09; 2.1.BFS过程 2.2.应用 2.3.双端队列BFS 实现 2.4.优先队列BFS&#xff08;堆优化 Dijkstra算法&#xff09; 1.DFS&#xff08;图论&#xff09; DFS全称是&#xff…

0基础安装Burpsuit专业版

首先先安装java环境,安装jdk 11的版本 文件中2023版的可以直接点开使用不需要复杂的操作的步骤 资源获取链接&#xff1a; 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;k2qq 其中&#xff1a;1号文件是bp的英文版激活包&#xff0c;-2号是中文版汉化版的激活包…

鸿蒙开发实战:【音频组件】

简介 音频组件用于实现音频相关的功能&#xff0c;包括音频播放&#xff0c;录制&#xff0c;音量管理和设备管理。 图 1 音频组件架构图 基本概念 采样 采样是指将连续时域上的模拟信号按照一定的时间间隔采样&#xff0c;获取到离散时域上离散信号的过程。 采样率 采样…

FreeRTOS学习第10篇--队列使用示例

FreeRTOS学习第10篇–队列使用示例 本文目标&#xff1a;FreeRTOS学习第10篇–队列使用示例 按照本文的描述&#xff0c;可以进行简单的使用队列。 本文实验条件&#xff1a;拥有C语言基础&#xff0c;装有编译和集成的开发环境&#xff0c;比如&#xff1a;Keil uVision5 …

KKView远程控制: todesk内网穿透

Todesk内网穿透&#xff1a;实现远程访问的新途径 在数字化时代&#xff0c;远程访问已成为许多企业和个人的基本需求。Todesk作为一款远程桌面控制软件&#xff0c;其内网穿透功能为用户提供了便捷、安全的远程访问体验。本文将介绍Todesk内网穿透的原理、应用场景及其优势&a…

【机器学习】走进监督学习:构建智能预测模型的第一步

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

2024年【天津市安全员C证】考试内容及天津市安全员C证考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证考试内容是安全生产模拟考试一点通生成的&#xff0c;天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2024年【天津市安全员C证】考试内容及天津市…

开发反应式API

开发反应式API 开发反应式API1 使用SpringWebFlux1.1 Spring WebFlux 简介1.2 编写反应式控制器 2 定义函数式请求处理器3 测试反应式控制器3.1 测试 GET 请求3.2 测试 POST 请求3.3 使用实时服务器进行测试 4 反应式消费RESTAPI4.1 获取资源4.2 发送资源4.3 删除资源4.4 处理错…

APP在应用商店该如何做好节日营销

38妇女节刚刚过去&#xff0c;不少商家吃上了一波节日红利。 你有没有注意到很多App在应用商店里改头换面&#xff0c;开展了很多以“三八节”为主题的营销活动&#xff0c;并且取得了不错的成绩。 可见季节性营销策划对产品的下载量和用户留存率还是很重要的。 那么我们如何…

数据结构知识点汇总(持续更新版)

数据结构 一、绪论 检测知识&#xff1a; 1.1基本概念 以前的计算机 弹道计算机 现如今 主要运用于非数值的计算 基本概念和术语 数据&#xff1a;是信息的载体&#xff0c;描述客观事物属性的值&#xff0c;字符以及所有能输入到计算机中并被计算机程序识别和处理的符号的…

CorelDRAW2024中文版全新来袭,让你的设计创意无限!

一、CorelDRAW软件的概述 CorelDRAW是一款由加拿大Corel公司开发的矢量图形编辑软件&#xff0c;自1989年以来&#xff0c;一直以其强大的功能和易用性深受广大设计师的喜爱。CorelDRAW软件不仅适用于个人创作者&#xff0c;还广泛应用于各类企业、出版社、教育机构等领域&…