百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

基于XML的DI,环境搭建流程

xsobi 2024-11-24 23:34 1 浏览

基于XML的依赖注入

环境搭建

为了更快的构建项目,我们可以在原有项目的基础上复制一个项目,如下图所示:

删除掉target文件夹和imp文件

修改产品名称为模块名称

在IDEA中导入刚才复制的模块

点击import module,选择Maven,点击Finish

最后点击OK即可导入成功

删除掉不需要的包和类,创建Student类和Spring核心配置文件applicationContext.xml.

Student类代码如下所示:

package com.xyr.demo01;
/**
* @Title 学生类
* @Author Xyr
* @Description:
*/
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

在核心配置文件applicationContext.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">
<!-- 声明Student类对象 -->
<bean id="s" class="com.xyr.demo01.Student"/>
</beans>

编写测试类测试通过Spring容器获取学生对象

测试类代码如下所示:

package com.xyr.demo01;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Title
* @Author Xyr
* @Description:
*/public class TestDI {
@Test
public void test01() {
// 创建容器对象
ApplicationContext ac
= new ClassPathXmlApplicationContext("demo01/applicationContext.xml");
// 从容器中获取学生对象
Student s = ac.getBean("s", Student.class);
System.out.println(s);
}
}

运行后程序输出结果为:

至此环境搭建完成

接下来学习DI, 通过Spring的语法,完成属性的赋值


DI: 依赖注入

什么是依赖?

classA 类中含有 classB 的实例,在 classA 中调用 classB 的方法完成功能,即 classA对classB 有依赖。

class A {
    // A类依赖B类
    B b; 
     public void method() {  
     b.show();
    }}
class B {
    public void show() 
{}
}

什么是注入? 其实就是赋值的意思

什么是依赖注入?

依赖注入 DI 是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。

Spring 的依赖注入对调用者与被调用者几乎没有任何要求,完全支持对象之间依赖关系的管理。

Spring 框架使用依赖注入(DI)实现 IOC。


DI的实现方式有两种

1. 在Spring的配置文件中,使用标签和属性完成,叫做基于XML的DI实现

2. 使用Spring注解的方式完成属性赋值,叫做基于注解的DI实现


DI的语法分类 (按照注入的方式分类)

1. set注入(设置注入): Spring调用类的set的方法,通过set方法实现属性的赋值.开发中常用

2. 构造方法注入: Spring调用类的有参构造方法,创建对象,通过构造方法完成属性的赋值.


简单类型注入 (按照注入的数据类型分类)

什么是简单类型?

Spring中规定Java的基本数据类型(包括包装类类型)和String都是简单数据类型.

接下来演示基于XML的简单类型的set注入

(1) 基于XML的简单类型的set注入

格式:

<bean id="创建对象的名称" class="对象所对应的全限定类名">
<property name="属性名字1" value="属性的值1"/>
<property name="属性名字2" value="属性的值2"/>
...
<property name="属性名字n" value="属性的值n"/>
</bean>

特点:

1. property表示属性的意思,出现在bean标签的内部

2. bean标签中可以有多个property标签,表示给多个属性通过set方法赋值

3. 一个property标签只能够给一个属性赋值

案例代码

XML配置如下所示:

<!-- 声明Student类对象 -->
<bean id="s" class="com.xyr.demo01.Student">
<property name="name" value="隔壁老王"/>
<property name="age" value="30"/>
</bean>
测试代码如下所示:
@Testpublic void test01() {
// 创建容器对象
ApplicationContext ac
= new ClassPathXmlApplicationContext("demo01/applicationContext.xml");
// 从容器中获取学生对象
Student s = ac.getBean("s", Student.class);
System.out.println(s);
}

运行结果如下所示:

注意事项:

1.通过XML配置的方式可以提高代码的扩展性和维护性,如果这个时候修改学生对象的姓名和年龄,我们不需要修改测试类代码,只需要修改配置,就可以完成属性注入.

2. set注入底层实现其实非常简单,本质就是通过反射调用对象的setXXX方法赋值,我们可以验证一下,修改学生类代码如下所示:

package com.xyr.demo01;
/**
* @Title
* @Author Xyr
* @Description:
*/public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("setName: " + name);
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
System.out.println("setAge: " + age);
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

重新运行程序,结果如下图所示:

综上所述,不难得出如下结论

<property name="name" value="隔壁老王"

相关推荐

js向对象中添加元素(对象,数组) js对象里面添加元素

一、添加一个元素对象名["属性名"]=值(值:可以是一个值,可以是一个对象,也可以是一个数组)这样添加进去的元素,就是一个值或对象或数组...

JS小技巧,如何去重对象数组?(一)

大家好,关于数组对象去重的业务场景,想必大家都遇到过类似的需求吧,这对这样的需求你是怎么做的呢。下面我就先和大家分享下如果是基于对象的1个属性是怎么去重实现的。方法一:使用.filter()和....

「C/C++」之数组、vector对象和array对象的比较

数组学习过C语言的,对数组应该都不会陌生,于是这里就不再对数组进行展开介绍。模板类vector模板类vector类似于string,也是一种动态数组。能够在运行阶段设置vector对象的长度,可以在末...

如何用sessionStorage保存对象和数组

背景:在工作中,我将[{},{}]对象数组形式,存储到sessionStorage,然后ta变成了我看不懂的形式,然后我想取之用之,发现不可能了~记录这次深刻的教训。$clickCouponIndex...

JavaScript Array 对象 javascript的array对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

JavaScript中的数组Array(对象) js array数组

1:数组Array:-数组也是一个对象-数组也是用来存储数据的-和object不同,数组中可以存储一组有序的数据,-数组中存储的数据我们称其为元素(element)-数组中的每一个元素都有一...

数组和对象方法&amp;数组去重 数组去重的5种方法前端

列举一下JavaScript数组和对象有哪些原生方法?数组:arr.concat(arr1,arr2,arrn);--合并两个或多个数组。此方法不会修改原有数组,而是返回一个新数组...

C++ 类如何定义对象数组?初始化数组?linux C++第43讲

对象数组学过C语言的读者对数组的概念应该很熟悉了。数组的元素可以是int类型的变量,例如int...

ElasticSearch第六篇:复合数据类型-数组,对象

在ElasticSearch中,使用JSON结构来存储数据,一个Key/Value对是JSON的一个字段,而Value可以是基础数据类型,也可以是数组,文档(也叫对象),或文档数组,因此,每个JSON...

第58条:区分数组对象和类数组对象

示例设想有两个不同类的API。第一个是位向量:有序的位集合varbits=newBitVector;bits.enable(4);bits.enable([1,3,8,17]);b...

八皇后问题解法(Common Lisp实现)

如何才能在一张国际象棋的棋盘上摆上八个皇后而不致使她们互相威胁呢?这个著名的问题可以方便地通过一种树搜索方法来解决。首先,我们需要写一个函数来判断棋盘上的两个皇后是否互相威协。在国际象棋中,皇后可以沿...

visual lisp修改颜色的模板函数 怎么更改visual studio的配色

(defunBF-yansemokuai(tuyuanyanse/ss)...

用中望CAD加载LISP程序技巧 中望cad2015怎么加载燕秀

1、首先请加载lisp程序,加载方法如下:在菜单栏选择工具——加载应用程序——添加,选择lisp程序然后加载,然后选择添加到启动组。2、然后是添加自定义栏以及图标,方法如下(以...

图的深度优先搜索和广度优先搜索(Common Lisp实现)

为了便于描述,本文中的图指的是下图所示的无向图。搜索指:搜索从S到F的一条路径。若存在,则以表的形式返回路径;若不存在,则返回nil。...

两个有助于理解Common Lisp宏的例子

在Lisp中,函数和数据具有相同的形式。这是Lisp语言的一个重大特色。一个Lisp函数可以分析另一个Lisp函数;甚至可以和另一个Lisp函数组成一个整体,并加以利用。Lisp的宏,是实现上述特色的...