SpringBoot(容器功能)

news2024/11/23 12:10:10

文章目录

    • 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;
    }

    @Override
    public 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) {
        //启动springboot
        ConfigurableApplicationContext 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 {
    @Bean
    public 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) {
        //启动springboot
        ConfigurableApplicationContext ioc = SpringApplication.run(MainApp.class, args);

        //获取第一个bean
        Monster bean1 = ioc.getBean("monster01", Monster.class);
        //获取第二个bean
        Monster 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) {
        //启动springboot
        ConfigurableApplicationContext 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,条件是有一个猫girl
    public 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) {
        //启动springboot
        ConfigurableApplicationContext ioc = SpringApplication.run(MainApp.class, args);

        //获取cat_boy
        Cat 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,条件是没有一个猫girl
    public 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) {
        //启动springboot
        ConfigurableApplicationContext ioc = SpringApplication.run(MainApp.class, args);

        //获取cat_boy2
        Cat 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) {
        //启动springboot
        ConfigurableApplicationContext ioc = SpringApplication.run(MainApp.class, args);

        //获取从beans.xml中导入到SpringBoot中的ioc容器中
        Object bean = ioc.getBean("monsterByImport");
        System.out.println(bean);
        
    }
}

5.成功获取

image-20240312174414367

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

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

相关文章

高中信息技术教资学习

一、几种排序方法的基本思想 1、直接插入排序&#xff08;假设按照从小到大进行排序&#xff09; 默认第一个元素是有序的&#xff0c;从有序的元素末尾开始&#xff0c;与要插入的元素进行比较&#xff0c;如果要插入的元素比有序的末尾元素小的话&#xff0c;就将有序末尾元…

适合一个人开的实体店:创业新选择与经营秘籍大公开

大家好&#xff0c;我是一名开鲜奶吧5年的实体店创业者&#xff0c;在行业里摸爬滚打多年&#xff0c;积累了丰富的经验。今天&#xff0c;我想和大家分享一些关于适合一个人开的实体店的创业新选择和经营秘籍。 首先&#xff0c;我们来聊一聊适合一个人开的实体店有哪些。这类…

多线程案例及常用模式

一.单例模式——经典的设计模式 什么是单例模式&#xff1a;就是规定一个类只能创建一个对象&#xff0c;也就是保证某个类在程序中只存在唯一一个实例&#xff0c;而不会创建出多个实例 根据对象创建的时机不同&#xff0c;可以分为饿汉模式和懒汉模式 1.饿汉模式 在类加载…

基与HTML5的塔防游戏设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 项目背景与相关技术 3 1.1 背景与发展简介 3 1.2 HTML5技术及其优势 4 1.3 JavaScript开发的优势与劣势 4 1.4 CSS样式表在开发中的用处 5 1.5 本章小结 6 2 系统分析 7 2.1 需求分析 7 2.2 问题分析 7 2.3 流程设计 7 2.3 功能分析 8 2.…

【Git】Github 上commit后,绿格子contribution却不显示?不知道怎么弥补?解决方法在这里

github 上commit后&#xff0c;绿格子&#xff08;contribution&#xff09;却不显示 问题描述 今天一直在github上面commit代码&#xff0c;但是github中并没有显示自己的contribution&#xff08;没有绿色的格子&#xff09;&#xff0c;全是空白&#xff0c;网上一查是因为…

点一下即可任意调整静态图片:这个开源AI图片项目你需要了解一下

项目简介 合成满足用户需求的视觉内容通常需要对生成对象的姿势、形状、表情和布局进行灵活而精确的控制。现有的方法通过手动注释的训练数据或先前的3D模型来获得生成对抗网络&#xff08;GAN&#xff09;的可控性&#xff0c;这通常缺乏灵活性、精确性和通用性。在这项工作中…

电玩城游戏大厅计时软件怎么用,佳易王计时计费管理系统软件定时语音提醒操作教程

电玩城游戏大厅计时软件怎么用&#xff0c;佳易王计时计费管理系统软件定时语音提醒操作教程 一、前言 以下软件操作教程以 佳易王电玩计时计费软件V18.0为例 说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件计时计费&#xff0c;只需点击开…

学c还行,学Python很累,还有其他语言适合我吗?

学c还行&#xff0c;学Python很累&#xff0c;还有其他语言适合我吗&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&a…

Java详解:单列 | 双列集合 | Collections类

○ 前言&#xff1a; 在开发实践中&#xff0c;我们需要一些能够动态增长长度的容器来保存我们的数据&#xff0c;java中为了解决数据存储单一的情况&#xff0c;java中就提供了不同结构的集合类&#xff0c;可以让我们根据不同的场景进行数据存储的选择&#xff0c;如Java中提…

Redis进阶--一篇文章带你走出Redis

目录 什么是Redis?? Redis有哪些使用场景? Redis是单线程还是多线程? 为什么Redis是单线程速度还是很快?? Redis持久化 RDB机制:(Redis DataBase) [是redis中默认的持久化方式] AOF机制:(Append Only File) Redis和MySQL如何保持数据一致????…

2024.3.12每日一题

LeetCode 在受污染的二叉树中查找元素 题目链接&#xff1a;1261. 在受污染的二叉树中查找元素 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给出一个满足下述规则的二叉树&#xff1a; root.val 0如果 treeNode.val x 且 treeNode.left ! null&#xff0c;那么 t…

【Actor-Critic】演员评论家模型

本博客代码部分参考了《动手学强化学习》 基于值函数的方法&#xff08;DQN&#xff09;和基于策略的方法&#xff08;REINFORCE&#xff09;&#xff0c;其中基于值函数的方法只学习一个价值函数&#xff0c;而基于策略的方法只学习一个策略函数。那么&#xff0c;一个很自然…

八数码题解

179. 八数码 - AcWing题库 首先要明确八数码问题的小结论&#xff0c;当原始序列中逆序对数列为奇数时一定无解&#xff0c;反之一定有解。 解法一&#xff1a;BFSA* 首先思考用纯BFS解决这个问题。 大致的框架就是&#xff1a; 队列q&#xff0c;状态数组dist&#xff0c;…

(ConvE)Convolutional 2D Knowledge Graph Embeddings

论文地址:https://arxiv.org/pdf/1707.01476.pdf 一、研究领域 知识图谱受限于知识构建方式的不足,常常伴随着不完备的特点,因此需要知识推理和补齐技术,来根据已有的事实来合理推断出新的事实以补充知识图谱,使其更完备。链路预测任务是知识推理和补齐技术的主要手段,用…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-1、线条平滑曲面(原始图形)

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…

数据分析实战-Python实现博客评论数据的情感分析

数据分析实战-Python实现博客评论数据的情感分析 学习建议SnowNLP基础什么是SnowNLP&#xff1f;SnowNLP情感分析 SnowNLP使用SnowNLP安装情感分析中文分词关键词提取拼音、词性标准 SnowNLP实战-博客评论数据的情感分析数据准备数据获取数据分析 总结 学习建议 现在很多网站、…

SpringBoot整合阿里云文件上传OSS以及获取oss临时访问url

SpringBoot整合阿里云文件上传OSS 1. 引入相关依赖<!--阿里云 OSS依赖--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version></dependency><dependen…

【MySQL】超详细_数据库的约束_MySQL的详细查询

复习前面MySQL的基础操作&#xff0c;目的是让我们有印象&#xff01;&#xff01;在这篇文章中&#xff0c;我主要写的是数据库的约束和查询操作的详细、深入讲解&#xff01; 基础操作 &#xff08;复习->【MySQL】超详细-基础操作&#xff09; 插入 insert -> inser…

https代理相对socks5代理有什么优势?

随着互联网的快速发展&#xff0c;代理服务已成为许多人在访问敏感或地理位置受限的网站时所依赖的工具。其中&#xff0c;HTTPS代理和SOCKS5代理是两种最常用的代理服务类型。本文将探讨HTTPS代理相对SOCKS5代理的优势。 1、安全性 HTTPS代理使用SSL/TLS协议对客户端和代理服…

C++ 矩形类

思维导图&#xff1a; #include <iostream> using namespace std; class Rect { private:int width;int height; public:void init(int w,int h){widthw;heighth;}void set_w(int w){widthw;}void set_h(int h){heighth;}void show(){cout << "perimeter &qu…