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

基于XML实现SpringIoC配置

目录

SpringIoc创建与使用的大致步骤

一.基于xml配置SpringIoc

二.基于xml配置DI

三.创建IoC容器并获取组件


SpringIoc创建与使用的大致步骤

 SpringIoC的创建与使用过程分为3步

1.编写配置信息(编写XML,注解、Java类)

2.创建IoC容器(实例化Ioc对象)

3.从Java代码中获取组件并使用


一.基于xml配置SpringIoc

实现过程思路:

1.配置SpringIoc的jar包依赖

 <!-- SpringIoc核心jar包 包含core ioc breans 等 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><!-- junit5测试 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.3.1</version> <!-- 使用属性引用JUnit Jupiter版本 --><scope>test</scope></dependency>

2.编写xml配置文件(配置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"></beans>

由于SpringIoc是存放组件的容器,而组件内容是可重复使用的对象。在xml中<bean>标签就是代表着组件

3.三种创建组件的方式

不同的创建组件的方式,对应的xml配置也不同。下面介绍三种创建组件的方式,无参构造方式创建组件,静态工厂创建、非静态工厂创建

1.无参构造方式创建组件

        当通过构造函数方法创建一个bean(组件对象) 时,所有普通类都可以由 Spring 使用并与之兼容。也就是说,正在开发的类不需要实现任何特定的接口或以特定的方式进行编码。只需指定 Bean 类信息就足够了。但是,默认情况下,我们需要一个默认 (空)构造函数。

无参构造对象代码案例

package com.alphamilk.Ioc;
//无参构造类
public class wucanTemp {public void doWork(){System.out.println("调用无参构造方法doWork函数");}
}

 对应的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 一个组件信息 一个组件对象id:组件的唯一标识,不可重复class:组件通过反射创建,所以需要类的权限定符配置完一个组件相当于new了一个wucanTemp对象
-->
<bean id="wucanTemp" class="com.alphamilk.Ioc.wucanTemp"/>
</beans>

2.静态工厂创建组件

静态工厂代码:

package com.alphamilk.Ioc;//静态工厂代码
public class HelloTemp {private HelloTemp(){}public static HelloTemp getHelloTemp(){HelloTemp temp = new HelloTemp();return temp;}
}

 对应XML配置:

<!--    静态工厂的组件配置<bean 一个组件信息,一个组件对象 ,一个工厂静态方法id:组件的唯一标识class:类的权限定符factory-method:工厂的静态方法
--><bean id="helloTemp" class="com.alphamilk.Ioc.HelloTemp" factory-method="getHelloTemp"/>

3.非静态工厂创建组件

package com.alphamilk.Ioc;//非静态工厂
public class FactoryNoStatic {private static FactoryNoStatic factoryNoStatic = new FactoryNoStatic();public FactoryNoStatic getInstance(){return  factoryNoStatic;}
}

对应的XML配置

<!--    3非静态工厂配置组件-->
<!--    3.1配置工厂类的组件信息--><bean id="factoryNoStatic" class="com.alphamilk.Ioc.FactoryNoStatic"/><!--    3.2通过指定非静态工厂对象和方法名来配置生成的ioc信息--><bean id="factoryNoStatic2" factory-bean="factoryNoStatic" factory-method="getInstance"/>


二.基于xml配置DI

DI(依赖注入)有两种实现方式

第一种通过构造函数实现,另一种是通过setter实现,两种不同的方式实现对应的xml配置也有所不同。下边分别介绍每种的配置。

1.基于构造函数实现对象

基于构造函数的 DI 是通过容器调用具有多个参数的构造函数来完成的,每个参数表示一个依赖项下面的示例演示一个只能通过构造函数注入进行依赖项注入的类!

基于单参构造方法

类对象案例:

package com.alphamilk.loc2;public class UserDao {
}public class UserService {private UserDao userDao = new UserDao();private String name;private int age;//  单参构造方法UserService(UserDao userDao){this.userDao = userDao;}
//    多参构造方法UserService(String name,int age,UserDao userDao){this.name=name;this.age = age;this.userDao = userDao;}
}

单参构造方法下,DI(依赖注入)的配置

<?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"><!--    单参数构造方法-->
<!--    步骤1:将对象都存放在IOc容器中-->
<bean id="userDao" class="com.alphamilk.loc2.UserDao"/><!--    构造参数传递di的配置<constructor-org 构造参数传值的di配置value=直接属性值ref = 引用其它的bean组件,传入bean的id值
--><bean id="service" class="com.alphamilk.loc2.UserService"><constructor-arg ref="userDao"/></bean>
</beans>

多参情况下DI(依赖注入)对应xml配置

<!--    基于多参构造方法-->
<!--    步骤1:将对象存放在Ioc容器中--><bean id="userDao" class="com.alphamilk.loc2.UserDao"/><bean id="service" class="com.alphamilk.loc2.UserService">
<!--        方案1:通过使用name对应参数配置【推荐】--><constructor-arg name="age" value="29"/><constructor-arg name="name" value="黄小龙"/><constructor-arg name="userDao" ref="userDao"/></bean><bean id="userDao" class="com.alphamilk.loc2.UserDao"/><bean id="service" class="com.alphamilk.loc2.UserService">
<!--        方案2:通过顺序的方式传递参数--><constructor-arg value="黄小龙"/><constructor-arg value="29"/><constructor-arg ref="userDao"/></bean><bean id="userDao" class="com.alphamilk.loc2.UserDao"/><bean id="service" class="com.alphamilk.loc2.UserService"><!--        方案3:通过下角标位置的方式传递参数--><constructor-arg index="0" value="黄小龙"/><constructor-arg index="1" value="29"/><constructor-arg index="2" ref="userDao"/></bean>

2.基于setter函数实现对象

基于构造函数的 DI 是通过容器调用具有多个参数的构造函数来完成的,每个参数表示一个依赖项
下面的示例演示通过构造函数注入多个参数,参数包含其他 bean和基本数据类型!

类对象案例:

package com.alphamilk.loc3;public class UserDao {
}//setter方式注入
public class UserService {private UserDao userDao = new UserDao();private String name;private int age;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}
}

对应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">
<!--触发 setter方法进行注入--><bean id="userDao" class="com.alphamilk.loc3.UserDao"/>
<!--    name-》属性名 setter方法的 去掉set并且首字母小写的值! 调用set方法名比如setName -》namevalue | ref 进行二选一 value=直接属性值 ref = 其他bean的id
--><bean id="service" class="com.alphamilk.loc3.UserService"><property name="age" value="52"/><property name="name" value="张三"/><property name="userDao" ref="userDao"/></bean>
</beans>


三.创建IoC容器并获取组件

1.创建Ioc容器对象

首先类对象

package com.alphamilk.loc4;public class HelloTemp {public void doWork(){System.out.println("HelloTemp is Working");}
}

然后进行xml文件配置IoC

<?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 id="helloTemp" class="com.alphamilk.loc4.HelloTemp"/>
</beans>

 两种实现创建IoC容器对象

package com.alphamilk.Ioc;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {
//    创建SpringIoc容器方法
/*两个接口BeanFactoryApplicationContext四个实现类ClassPathXmlApplicationContext 读取类路径下的xml配置方式WebApplicationContext读取指定文件的xml配置方式FileSystemXmlApplicationContext读取配置类方式的ioc容器AnnotationApplicationContext web项目专属的配置ioc容器*/@org.junit.jupiter.api.Testpublic void createIoc(){
//  方式一:通过直接创建容器并且指定配置文件即可ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Springioc.xml");//   方式二:通过先创建ioc容器对象,再指定配置文件,再刷新ClassPathXmlApplicationContext applicationContext1 = new ClassPathXmlApplicationContext();applicationContext1.setConfigLocations("Springioc.xml");applicationContext1.refresh();}
}

2.通过创建的容器获取组件

获取组件步骤:1.创建ioc容器 2.获取组件

三种获取组件方式:

  • 第一种获取bean的方式,通过获取getBean加上bean的id,返回Object类型,再将其转为对应的类型。
  • 第二种获取bean的方式,通过获取bean的同时,指定其返回的类型。
  • 第三种获取bean方式,根据类型获取。
package com.alphamilk.Ioc;import com.alphamilk.loc4.HelloTemp;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {@org.junit.jupiter.api.Testpublic  void useBean(){//       第一种获取bean的方式,通过获取getBean加上bean的id,返回Object类型,再将其转为对应的类型
//        创建Ioc容器ApplicationContext context = new ClassPathXmlApplicationContext("springioc.xml");
//        获取组件HelloTemp helloTemp = (HelloTemp) context.getBean("helloTemp");//    第二种获取bean的方式,通过获取bean的同时,指定其返回的类型
//      TODO:注意可能会出现向下转型异常
//        创建Ioc容器ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext();applicationContext.setConfigLocation("springioc.xml");applicationContext.refresh();
//        获取组件applicationContext.getBean("helloTemp",HelloTemp.class);//      第三种获取bean方式,根据类型获取
//        创建Ioc容器ClassPathXmlApplicationContext classPathXmlApplicationContext2 = new ClassPathXmlApplicationContext();classPathXmlApplicationContext2.setConfigLocation("springioc.xml");classPathXmlApplicationContext2.refresh();
//        获取组件
//        TODO:注意这种方法有许多条件
//        根据bean类型获取,一次只能有一种类型,举例在ioc容器中如果有多个HelloTemp对象,继续使用这种方法会报错classPathXmlApplicationContext2.getBean(HelloTemp.class);//        注意虽然是三种不同的获取方式,但是获取到的对象都是同一个,三种方法只是对应三种类型的指针指向Ioc容器中存放的组件helloTemp.doWork();}
}


基于注解配置

SpringIoC基于注解配置_Alphamilk的博客-CSDN博客

相关文章:

基于XML实现SpringIoC配置

目录 SpringIoc创建与使用的大致步骤 一.基于xml配置SpringIoc 二.基于xml配置DI 三.创建IoC容器并获取组件 SpringIoc创建与使用的大致步骤 SpringIoC的创建与使用过程分为3步 1.编写配置信息&#xff08;编写XML&#xff0c;注解、Java类&#xff09; 2.创建IoC容器&…...

Kaniko在containerd中无特权快速构建并推送容器镜像

目录 一、kaniko是什么 二、kaniko工作原理 三、kanijo工作在Containerd上 基于serverless的考虑&#xff0c;我们选择了kaniko作为镜像打包工具&#xff0c;它是google提供了一种不需要特权就可以构建的docker镜像构建工具。 一、kaniko是什么 kaniko 是一种在容器或 Kube…...

分享5款不会被打入冷宫的神器软件

​ 检查一下你最近安装的软件&#xff0c;他们是不是都一样无法避免最终被你打入冷宫的命运&#xff1f;我们明明很懂“在精不在多”的道理&#xff0c;却依然让我们的电脑塞满了形形色色无用的软件。你需要知道的是&#xff0c;如何找到一款适合自己且真正实用的电脑软件。 自…...

Windows如何部署Redis

一、简介 Redis (Remote Dictionary Server) 是一个由意大利人 Salvatore Sanfilippo 开发的 key-value 存储系统&#xff0c;具有极高的读写性能&#xff0c;读的速度可达 110000 次/s&#xff0c;写的速度可达 81000 次/s 。 二、下载 访问 https://github.com/tporadows…...

VUE数据双向绑定原理解析

VUE数据双向绑定原理解析 在Vue.js中&#xff0c;数据双向绑定是一项非常强大的功能。它使开发者能够轻松地将模板与数据进行动态关联&#xff0c;实现了页面和数据之间的实时同步更新。本文将深入探讨VUE中数据双向绑定的原理&#xff0c;并通过代码示例演示其工作机制。 1.…...

SSM商城项目实战:订单管理

SSM商城项目实战&#xff1a;订单管理 在SSM商城项目中&#xff0c;订单管理是一个非常重要的功能模块。本文将详细介绍订单管理的实现思路和步骤代码。 实现SSM商城项目中订单管理功能的思路如下&#xff1a; 设计数据库表结构&#xff1a;根据订单管理的需求&#xff0c;设计…...

SELinux 入门 pt.2

哈喽大家好&#xff0c;我是咸鱼 在《SELinux 入门 pt.1》中&#xff0c;咸鱼向各位小伙伴介绍了 SELinux 所使用的 MAC 模型、以及几个重要的概念&#xff08;主体、目标、策略、安全上下文&#xff09; 我们还讲到&#xff1a; 对于受 SELinux 管制的进程&#xff0c;会先…...

函数(个人学习笔记黑马学习)

1、函数定义 #include <iostream> using namespace std;int add(int num1, int num2) {int sum num1 num2;return sum; }int main() {system("pause");return 0; } 2、函数的调用 #include <iostream> using namespace std;int add(int num1, int num2…...

《Flink学习笔记》——第五章 DataStream API

一个Flink程序&#xff0c;其实就是对DataStream的各种转换&#xff0c;代码基本可以由以下几部分构成&#xff1a; 获取执行环境读取数据源定义对DataStream的转换操作输出触发程序执行 获取执行环境和触发程序执行都属于对执行环境的操作&#xff0c;那么其构成可以用下图表示…...

Vue3.0 新特性以及使用变更总结

Vue3.0 在2020年9月正式发布了&#xff0c;也有许多小伙伴都热情的拥抱Vue3.0。去年年底我们新项目使用Vue3.0来开发&#xff0c;这篇文章就是在使用后的一个总结&#xff0c; 包含Vue3新特性的使用以及一些用法上的变更。 图片.png 为什么要升级Vue3 使用Vue2.x的小伙伴都熟悉…...

ToBeWritten之VSOC安全运营

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…...

2023爱分析·一站式通信解决方案市场厂商评估报告:牛信云

[图片] 01 中国企业出海发展背景及阶段 出海背景&#xff1a;出海&#xff0c;对中国企业而言&#xff0c;并不陌生。从最初的贸易型出海&#xff0c;到制造业崛起&#xff0c;再到互联网、移动互联网产业腾飞&#xff0c;中国企业在出海道路上走的越发稳健。行业也从最初的家电…...

微信小程序消防知识每天学平台设计与实现

摘 要 消防是当下一个人都需要在日常生活中所高度重视的事项。消防安全关系到居民的日常生活的安全&#xff0c;通过学习消防知识能够提升人们在日常生活中对于灾难的防范。通过对当下的大学生进行调查研究后发现&#xff0c;现在的年轻人在消防意识上比较的单薄&#xff0c;对…...

Oracle跨库访问DBLINK

1. DBLINK的介绍 Oracle在进行跨库访问时&#xff0c;可以创建DBLINK实现&#xff0c;比如要将UAT的表数据灌入开发环境&#xff0c;则可以使用UAT库为数据源&#xff0c;通过DBLINK实现将查出的数据灌入开发库。 简而言之就是在当前数据库中访问另一个数据库中的表中的数据 2…...

【vue3.0 组合式API与选项式API是什么,有什么区别】

vue3.0 组合式API与选项式API是什么 Vue3.0中引入了组合式API&#xff08;Composition API&#xff09;&#xff0c;同时保留了选项式API&#xff08;Options API&#xff09;。两种 API 风格都能够覆盖大部分的应用场景。它们只是同一个底层系统所提供的两套不同的接口。实际…...

React配置代理的5种方法

React配置代理的五种方法的介绍 使用create-react-app的代理配置&#xff1a; 使用场景&#xff1a;适用于使用create-react-app创建的React项目&#xff0c;特别是小型项目或快速原型开发。优点&#xff1a;配置简单&#xff0c;无需额外安装依赖&#xff0c;适合快速开发和简…...

皮卡丘靶场搭建遇到的问题大全

该博客记录我在安装皮卡丘靶场中遇到的一些问题。 1、 phpstudy_pro启动Mysql失败 自己电脑开启了mysql服务&#xff0c;使用winr&#xff0c;services.msc&#xff0c;找到自己的mysql服务&#xff0c;关闭。再次尝试使用phpstudy_pro启动mysql&#xff0c;成功解决。 2、皮…...

【C++】C++11的新特性(上)

引入 C11作为C标准的一个重要版本&#xff0c;引入了许多令人振奋的新特性&#xff0c;极大地丰富了这门编程语言的功能和表达能力。本章将为您介绍C11的一些主要变化和改进&#xff0c;为接下来的章节铺垫。 文章目录 引入 一、列表初始化 1、1 {} 初始化 1、2 std::initiali…...

ubuntu学习(四)----文件写入操作编程

1、write函数的详解 ssize_t write(int fd,const void*buf,size_t count); 参数说明&#xff1a; fd:是文件描述符&#xff08;write所对应的是写&#xff0c;即就是1&#xff09; buf:通常是一个字符串&#xff0c;需要写入的字符串 count&#xff1a;是每次写入的字节数…...

如何解决MySQL中的套接字错误

MySQL通过使用** socket文件**来管理到数据库服务器的连接&#xff0c;socket文件是一种特殊的文件&#xff0c;可以促进不同进程之间的通信。MySQL服务器的套接字文件名为mysqld.sock&#xff0c;在Ubuntu系统中&#xff0c;它通常存储在/var/run/mysqld/目录中。该文件由MySQ…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...