基于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博客

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

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

相关文章

MySql015——使用子查询

一、创建customers表 ######################## # Create customers table ######################## use study;CREATE TABLE customers (cust_id int NOT NULL AUTO_INCREMENT,cust_name char(50) NOT NULL ,cust_address char(50) NULL ,cust_city char…

k8s 常用命令(三)

1、查看版本信息&#xff1a;kubectl version [rootmaster ~]# kubectl version [rootmaster ~]# kubectl version Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", GitCommit:"ca643a4d1f7bfe34773c74f7952…

系统架构设计高级技能 · Web架构

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 Web架构 一、Web架构介绍1.1 Web架构涉及技术1.2 单台服务…

银河麒麟V10(Tercel)服务器版安装 Docker

一、服务器环境 ## 查看系统版本&#xff0c;确认版本 cat /etc/kylin-release Kylin Linux Advanced Server release V10 (Tercel)## 操作系统 uname -p aarch64## 内核版本&#xff08;≥ 3.10&#xff09; uname -r 4.19.90-21.2.ky10.aarch64## iptables 版本&#xff08;…

民族传统文化分享系统uniapp 微信小程序

管理员、用户可通过Android系统手机打开系统&#xff0c;注册登录后可进行管理员后端&#xff1b;首页、个人中心、用户管理、知识分类管理、知识资源管理、用户分享管理、意见反馈、系统管理&#xff0c;用户前端&#xff1b;首页、知识资源、用户分享、我的等。 本系统的使用…

Mybatis-Plus快速入门

目录 一、基础工程 1、创建一个数据库&#xff1a;mp 2、添加数据 3、创建初始工程 4、添加依赖 二、Mybatis Mybatis-Plus 1、创建子工程&#xff1a;mybatis-plus-simple 2、在子工程下添加配置 2.1Mybatis实现查询User 2.1.1、编写User实体对象 2.1.2、编写UserMa…

【大数据】Linkis:打通上层应用与底层计算引擎的数据中间件

Linkis&#xff1a;打通上层应用与底层计算引擎的数据中间件 1.引言2.背景3.设计初衷4.技术架构5.业务架构6.处理流程7.如何支撑高并发8.用户级隔离度和调度时效性9.总结 Linkis 是微众银行开源的一款 数据中间件&#xff0c;用于解决前台各种工具、应用&#xff0c;和后台各种…

STL-空间配置器的了解

前言 空间配置器&#xff0c;顾名思义就是为了各个容器高效的管理空间&#xff08;空间的申请与回收&#xff09;的&#xff0c;在默默的工作的。虽然在常规上使用STL时&#xff0c;可能用不上它&#xff0c;但是站在学习研究的角度&#xff0c;学习它的实现原理对我们有很大的…

MySQL项目迁移华为GaussDB PG模式指南

文章目录 0. 前言1. 数据库模式选择&#xff08;B/PG&#xff09;2.驱动选择2.1. 使用postgresql驱动2.1. 使用opengaussjdbc驱动 3. 其他考虑因素4. PG模式4.1 MySQL和OpenGauss不兼容的语法处理建议4.2 语法差异 6. 高斯数据库 PG模式JDBC 使用示例验证6. 参考资料 本章节主要…

什么是JVM ?

目录 一、JVM 简介 1.1 JVM 发展史 1.Sun Classic VM 2.Exact VM 3.HotSpot VM 4.JRockit 5.J9 JVM 6.Taobao JVM&#xff08;国产研发&#xff09; 1.2 JVM 和《Java虚拟机规范》 二、 JVM 运行流程 JVM 执行流程 三、JVM 运行时数据区 3.1 堆&#xff08;线程共享…

java八股文面试[JVM]——垃圾回收

参考&#xff1a;JVM学习笔记&#xff08;一&#xff09;_卷心菜不卷Iris的博客-CSDN博客 GC垃圾回收面试题&#xff1a; JVM内存模型以及分区&#xff0c;需要详细到每个区放什么 堆里面的分区&#xff1a;Eden&#xff0c;survival from to&#xff0c;老年代&#xff0c;各…

git分支管理策略

git的基础操作以及常用命令在上篇博客哦~ git原理与基本使用 1.分支管理 1.主分支 在版本回退⾥&#xff0c;我们已经知道&#xff0c;每次提交&#xff0c;Git都把它们串成⼀条时间线&#xff0c;这条时间线就可以理解为是⼀个分⽀。截⽌到⽬前&#xff0c;只有⼀条时间线&…