当前位置: 首页 > news >正文

Spring容器及实例化

一、前言

Spring 容器是 Spring 框架的核心部分,它负责管理和组织应用程序中的对象(Bean)。Spring 容器负责创建、配置和组装这些对象,并且可以在需要时将它们提供给应用程序的其他部分。

Spring 容器提供了两种主要类型的容器:BeanFactory 和 ApplicationContext。BeanFactory 是最基本的容器,提供了基本的 Bean 生命周期管理和依赖注入的功能。ApplicationContext 是 BeanFactory 的一个子接口,它提供了更多的企业级功能,例如国际化、事件传播、资源加载等。

在 Spring 中,通常通过配置文件或注解来定义和配置 Bean。当 Spring 容器启动时,它会根据配置的信息来实例化和初始化对象。

二、xml配置初步使用

2.1 添加依赖

创建maven项目,并在pom.xml中添加Spring的依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>spring_01</artifactId><version>1.0</version><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.22</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version></dependency></dependencies></project>

2.2 xml方式配置bean

新建bean.xml文件,目录结构

 

bean.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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--    构造函数实例化--><bean id="employ" class="com.demo.entity.Employ"><!--        没有构造函数的时候--><!--        <constructor-arg index="0" value="hanzhe"/>--><!--        <constructor-arg index="1" value="18"/>--><!--        <property name="username" value="hanzhe"></property>--><!--        <property name="password" value="18"></property>--></bean></beans>

2.3 测试类查看效果

SpringTest.java

package com.demo;
/*** @author zhe.han* @date 2023/2/2 14:28*/
public class SpringTest {/*** xml形式的简单入门* <p>* 1:instantiation with a constructor 构造函数实例化*/@Testpublic void test1() {/*** 加载文件的方式:使用resource加载文件**/ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/test1.xml");// ApplicationContext context = new ClassPathXmlApplicationContext("file:E:\\study\\28spring\\spring_01\\src\\main\\resources\\test1.xml");Emp employ = (Emp) context.getBean("employ");final String password = employ.getPassword();final String username = employ.getUsername();System.out.println(username);System.out.println(password);}
}

三、实例化 Bean

官网中提到实例化bean,有三种方式

 

3.1 默认的无参构造函数

bean.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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--构造函数实例化bean    --><bean id="emp" class="com.demo.entity.Emp"></bean>
</beans>
public class Emp {final Log log = LogFactory.getLog(Emp.class);private String username;private String password;public Emp(String username, String password) {this.username = username;this.password = password;}public Emp() {log.info("构造方法实例化......");}@Overridepublic String toString() {return "Emp{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

测试类:

 @Testpublic void test1() {/*** 加载文件的方式:使用resource加载文件**/ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/test1.xml");Emp employ = context.getBean("employ", Emp.class);log.info(employ);}

debug跟踪源码,了解实例化过程。

debug定位到这个方法中:

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance

最终执行到这个方法:使用无参构造函数实例化bean

// No special handling: simply use no-arg constructor.
return instantiateBean(beanName, mbd);

3.2 静态工程方法

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--    静态工厂实例化--><bean id="employ2_2" class="com.demo.entity.Emp2" factory-method="createInstance"></bean>
</beans>/*** Bean的实例化:** <p>* 2:instantiation with a static Factory Method:静态工厂实例化* <p>*/@Testpublic void test2() {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/test2.xml");// 静态工厂实例化Emp2 employ = context.getBean("employ2_2", Emp2.class);log.info(employ);}

 断点调试:

debug定位到这个方法中:‘

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance 

最终执行到这个方法:使用无参构造函数实例化bean

// 判断BeanDefination中是否有factory-method 这个属性
if (mbd.getFactoryMethodName() != null) {return instantiateUsingFactoryMethod(beanName, mbd, args);}

3.3 实例工厂方法

test3.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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!-- the factory bean, which contains a method called createInstance() --><bean id="serviceLocator" class="com.demo.factory.DefaultServiceLocator"></bean><!-- the bean to be created via the factory bean --><bean id="employ3"factory-bean="serviceLocator"factory-method="createEmploy2_3Instance"/></beans>

 DefaultServiceLocator

public class DefaultServiceLocator {final static Log log = LogFactory.getLog(Emp2.class);private static Emp2 employ = new Emp2();public Emp2 createInstance() {employ.setPassword("password");employ.setUsername("username");log.info("实例工厂方法");return employ;}}

断点发现实例化流程和静态工厂方法一样:

四、注解方式配置bean

4.1 使用Configuration 和Bean配置 

// @Configuration 作为配置类,@Bean 用于实例化、配置、初始化Spring的bean对象

AppConfig

@Configuration
public class AppConfig {/*** 等价于在xml中配置:** <beans>*       <bean id="mmp" class="com.demo.entity.Emp"/>* </beans>* @return*/@Beanpublic Emp emp() {return new Emp("zhang san", "123456");}}/*** 注解方式配置spring的bean*/@Testpublic void test4() {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);Emp bean = context.getBean(Emp.class);log.info(bean);}

最终的实例化方法和静态工厂、工厂实例化方法一致。

以上就是Spring的初步使用和Bean的实例化的方法的了解。 

相关文章:

Spring容器及实例化

一、前言 Spring 容器是 Spring 框架的核心部分&#xff0c;它负责管理和组织应用程序中的对象&#xff08;Bean&#xff09;。Spring 容器负责创建、配置和组装这些对象&#xff0c;并且可以在需要时将它们提供给应用程序的其他部分。 Spring 容器提供了两种主要类型的容器&…...

# Go学习-Day9

文章目录 Channel声明存入取出一个简单的死锁分析 个人博客&#xff1a;CSDN博客 Channel Channel本质是一个队列多goroutine访问时不需要加锁&#xff0c;Channel天然线程安全channel有类型&#xff0c;只能写入相同类型channel是引用类型channel必须初始化才能写入数据&…...

chatGPT如何在Java中使用

ChatGPT是一个基于GPT模型的聊天机器人平台&#xff0c;它提供了API接口&#xff0c;可以通过HTTP请求与之交互。您可以使用Java编写程序&#xff0c;通过HTTP请求与ChatGPT进行交互&#xff0c;实现聊天机器人的功能。 具体步骤如下&#xff1a; 1、注册ChatGPT账号并创建应…...

vue+axios——创建多个实例共用请求拦截器和响应拦截器(403错误信息不提示bug解决)——基础积累

创建多个实例共用请求拦截器和响应拦截器&#xff1a;使用的是函数的继承&#xff0c;也就是call()方法&#xff0c;这个方法第一个参数就是this,后面的参数可以是一个也可以是多个。最后一定要记得要return出去&#xff0c;否则接口是拿不到数据的。 import axios from axios…...

全球免费编程教育网站:Code.org

全球免费编程教育网站&#xff1a;Code.org 官网地址注册使用 你还在为小朋友的编程教育而发愁吗&#xff1f; 你还在为小朋友放假无聊而头疼吗&#xff1f; 他来了他来了&#xff0c;全球免费编程教育网站来了。 2013年成立的Code.org是一个非营利组织。 它致力于为年轻女子、…...

构造函数与成员变量初始化

C自学精简教程 目录(必读) 1 为什么需要定义构造函数&#xff1f; 构造函数主要用来给成员变量初始化。 让类对象有一个良好的开始状态。 2 构造函数初始化成员变量 下面我们来完善上一篇文章中的几个构造函数。 让这些构造函数完成给成员变量初始化的职责。 为此&#…...

使用Go env命令设置Go的环境

文章目录 前言Linux的设置Windlows设置Go version > 1.13 当你的GO的版本大于1.13的时候 Set environment variable allow bypassing the proxy for selected modules 前言 在进行Go开发的时候&#xff0c;设置Go的环境变量信息是必须的。下面介绍windows和Linux&#xff0…...

目标检测YOLO实战应用案例100讲-道路场景下目标检测与分割模型的压缩研究与实现(续)

目录 道路场景下目标检测与语义分割模型的改进研究 3.1 道路场景数据集分析 3.1.1 Cityscapes数据集...

b站手机缓存文件转MP4

b站缓存的文件 音频、视频、弹幕是分开的 这里我只用到了音频和视频所以只介绍这一部分 b站的缓存视频文件和路径结构如下 默认缓存路径 内部存储\Android\data\tv.danmaku.bilil\download\89720189 文件夹结构 文件夹 c_738583 这是单个视频的缓存文件夹 进入c_738583文件夹…...

一个集成的BurpSuite漏洞探测插件1.2

4、DNSLog查询漏报 注&#xff1a;扫描结束后才会在BurpSuite的Target、Dashboard模块显示高危漏洞&#xff0c;进程扫描中无法进行同步&#xff0c;但可以在插件中查看&#xff08;涉及到DoPassive方法问题&#xff09;。...

[FMMPEG] parse与 demuxer

FFmpeg源码分析&#xff1a;av_parser_parse2()解析数据包 ffmpeg 4.3添加自定义demuxer ffmpeg API基础...

【Bug】Ubuntu 有线设置打不开无反应

前言&#xff1a; 突然有线设置就没法启用了&#xff0c;但是能联网&#xff0c;能查看ip 解决&#xff1a; 最后安装了一个新的依赖包&#xff1a; sudo apt install gnome-control-center 然后就可以了 还有一个方法&#xff0c;没试过&#xff0c;但感觉有点道理的&#…...

迈向无限可能, ATEN宏正领跑设备切换行业革命!

随着互联网在各个领域的广泛应用,线上办公这一不受时间和地点制约、不受发展空间限制的办公模式开始广受追捧,预示着经济的发展正朝着新潮与活跃的方向不断跃进。当然,在互联网时代的背景下,多线程、多设备的线上办公模式也催生了许多问题:多设备间无法进行高速传输、切换;为保…...

Ubuntu18.04:ORB-SLAM3使用数据集构建地图和保存点云地图

文章目录 保存地图方法一&#xff1a;使用ORB-SLAM3自带的保存方法&#xff08;oea后缀文件&#xff09;保存地图方法二&#xff1a;使用PCL库保存为PCD类型地图文件安装PCL库&#xff1a;取巧方法&#xff1a;CMakeLists.txt 文件修改内容&#xff1a;&#xff08;向该文件内添…...

找到自制电子杂志的方法了,快来看看?

终于找到自制电子杂志的方法了&#xff0c;这真是令人兴奋啊&#xff01;现在&#xff0c;我们可以利用这个方法来创造属于自己的电子杂志&#xff0c;将我们的想法和创意以独特的方式展现给世界。 1.需要一个电子杂志制作工具 市面上有许多专门用于制作电子杂志的工具&#x…...

Django请求的生命周期

Django请求的生命周期是指: 当用户在浏览器上输入URL到用户看到网页的这个时间段内&#xff0c;Django后台所发生的事情。 直白的来说就是当请求来的时候和请求走的阶段中&#xff0c;Django的执行轨迹。 一个完整的Django生命周期: 用户从客户端发出一条请求以后&#xff…...

Kotlin 中 OkHttp 使用及解析

build.gradle dependencies {//OkHttpimplementation com.squareup.okhttp3:okhttp:4.9.0 } 简单使用例子 val okHttpClient OkHttpClient.Builder().connectTimeout(Duration.ofSeconds(10)).readTimeout(Duration.ofSeconds(10)).writeTimeout(Duration.ofSeconds(10)).re…...

【C++代码】用栈实现队列,用队列实现栈--代码随想录

队列是先进先出&#xff0c;栈是先进后出。卡哥给了关于C方向关于栈和队列的4个问题&#xff1a; C中stack 是容器么&#xff1f; 使用的stack是属于哪个版本的STL&#xff1f; 使用的STL中stack是如何实现的&#xff1f; stack 提供迭代器来遍历stack空间么&#xff1f; …...

肖sir__linux详解__001

linux详解: 1、ifconfig 查看ip地址 2、6版本&#xff1a;防火墙的命令&#xff1a; service iptables status 查看防火墙状态 service iptables statrt 开启防火墙 service iptables stop 关闭防火墙 service iptables restart 重启防火墙状态 7版本&#xff1a; systemctl s…...

【Android Framework系列】第12章 RecycleView相关原理及四级缓存策略分析

1 RecyclerView简介 RecyclerView是一款非常强大的widget&#xff0c;它可以帮助您灵活地显示列表数据。当我开始学习 RecyclerView的时候&#xff0c;我发现对于复杂的列表界面有很多资源可以参考&#xff0c;但是对于简单的列表展现就鲜有可参考的资源了。虽然RecyclerView的…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

VASP软件在第一性原理计算中的应用-测试GO

VASP软件在第一性原理计算中的应用 VASP是由维也纳大学Hafner小组开发的一款功能强大的第一性原理计算软件&#xff0c;广泛应用于材料科学、凝聚态物理、化学和纳米技术等领域。 VASP的核心功能与应用 1. 电子结构计算 VASP最突出的功能是进行高精度的电子结构计算&#xff…...