Spring-(二)基于XML的DI

本文最后更新于:December 26, 2021 am

Spring 是目前主流的 Java Web 开发框架,是 Java 世界最为成功的框架。Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。该框架是一个轻量级的开源框架,具有很高的凝聚力和吸引力。Spring 框架不局限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。Spring 框架还是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力。

目录

1.设值注入(set注入)

调用类的set方法。

1.1 简单类型

借助set方法来实现,所以,需要给类创建set方法。

用法:

1
2
3
4
<bean id="" class=""> 
<property name="" value="" />
<property name="" value="" />
</bean>

其中,id是自定义的唯一值,class是对应类的全限定名称;
property用来给属性赋值,一个property只能给一个属性赋值,name是属性名称,value是属性的值。

注意:name属性在类中如果没有定义,但有对应的set方法,则依然可以正常运行!!如:没有定义age属性,但有一个setAge()方法,则程序依然可以正常运行。因为,name属性只是去找有没有对应的set方法,而不管有没有此属性。

示例:

Person.java 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.tothefor.dao;

/**
* @Author DragonOne
* @Date 2021/9/14 09:20
*/
public class Person {
private String name;
private int age;
private int money;

public void setName(String name) {
this.name = name;
}

public void setAge(int age) {
this.age = age;
}

public void setMoney(int money) {
this.money = money;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", money=" + money +
'}';
}
}

配置文件 applicationContext.xml:

1
2
3
4
5
<bean id="teP" class="com.tothefor.dao.Person">
<property name="name" value="龍" />
<property name="age" value="123" />
<property name="money" value="456" />
</bean>

测试类:

1
2
3
4
5
6
7
@Test
public void test04(){
String config = "bao1/applicationContext.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(config);
Person teP = (Person) applicationContext.getBean("teP");
System.out.println(teP);
}

1.2 引用类型

Person类中包含引用类型School。

1
2
3
4
5
6
7
8
9
10
11
12
<bean id="myP" class="com.tothefor.dao.bao2.Person">
<property name="name" value="loong" />
<property name="age" value="234" />
<property name="money" value="34" />
<!--引用类型-->
<property name="school" ref="myS" /> <!--这里使用ref属性来指向引用类型的配置-->
</bean>
<!--声明引用类型-->
<bean id="myS" class="com.tothefor.dao.bao2.School">
<property name="ad" value="cdut" />
<property name="name" value="ttttttt" />
</bean>

其他使用同上,测试类可参考 1.1

2.构造注入

调用有参构造函数。在创建对象的同时,在构造方法中给属性赋值。使用 <constructor-arg>标签,且一个此标签表示构造方法中的一个参数,若有多个参数则需要写多个此标签。
标签的属性:

  • name:表示构造方法中的形参名;
  • inde:表示构造方法中参数的位置,从左到右以0开始表示;
  • value:当参数类型是简单类型时,使用value;
  • ref:当参数类型是引用类型时,使用ref;
1
2
3
4
5
6
7
8
9
<bean id="myFun" class="com.tothefor.dao.bao3.Person">
<constructor-arg name="name" value="loong"/>
<constructor-arg name="age" value="23" />
<constructor-arg name="school" ref="mySS" /> <!--使用同set注入一样-->
</bean>
<bean id="mySS" class="com.tothefor.dao.bao3.School">
<property name="name" value="tewqewt"/>
<property name="adress" value="asdfghjk"/>
</bean>

示例:

Person类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.tothefor.dao.bao3;


/**
* @Author DragonOne
* @Date 2021/9/15 08:51
*/
public class Person {
private String name;
private int age;
private School school;

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", school=" + school +
'}';
}

public Person(String name, int age, School school) {
this.name = name;
this.age = age;
this.school = school;
}

public void setName(String name) {
this.name = name;
}

public void setAge(int age) {
this.age = age;
}

public void setSchool(School school) {
this.school = school;
}
}

applicationContext.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?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">


<!--使用name属性实现构造注入-->
<bean id="myFun" class="com.tothefor.dao.bao3.Person">
<constructor-arg name="name" value="loong"/>
<constructor-arg name="age" value="23" />
<constructor-arg name="school" ref="mySS" />
</bean>
<bean id="mySS" class="com.tothefor.dao.bao3.School">
<property name="name" value="tewqewt"/>
<property name="adress" value="asdfghjk"/>
</bean>

</beans>

<!--使用index属性-->
<bean id="myFun" class="com.tothefor.dao.bao3.Person">
<constructor-arg index="0" value="loong"/>
<constructor-arg index="1" value="23" />
<constructor-arg index="2" ref="mySS" />
</bean>
<bean id="mySS" class="com.tothefor.dao.bao3.School">
<property name="name" value="tewqewt"/>
<property name="adress" value="asdfghjk"/>
</bean>

以上实现效果是一样的,可自行分开进行测试。


<!--在使用index时,也是可以不写的,但顺序就不能随意,必须按照构造参数列表的顺序进行写-->
<bean id="myFun" class="com.tothefor.dao.bao3.Person">
<constructor-arg value="loong"/>
<!-- 等价于index=0 ,也可以理解成name=参数1 -->
<constructor-arg value="23" />
<!-- 等价于index=1 ,也可以理解成name=参数2 -->
<constructor-arg ref="mySS" />
<!-- 等价于index=2 ,也可以理解成name=参数3 -->
</bean>
<bean id="mySS" class="com.tothefor.dao.bao3.School">
<property name="name" value="tewqewt"/>
<property name="adress" value="asdfghjk"/>
</bean>

测试类:

1
2
3
4
5
6
7
@Test
public void test06(){
String config = "bao3/applicationContext.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(config);
Person teP = (Person) applicationContext.getBean("myFun");
System.out.println(teP);
}

3.构造注入创建文件对象

可以利用此方法,读到文件。

1
2
3
4
<bean id="myFile" class="java.io.File">
<constructor-arg name="parent" value="D:\a\b\c"/> <!--文件地址-->
<constructor-arg name="child" value="read.txt" /> <!--文件名-->
</bean>

测试类

1
2
File mfile = (File)applicationContext.getBean("myFile");
System.out.println(mfile.getName());//获取文件名

4.引用类型的自动注入

4.1 byName(按名称注入)

java类中引用类型的属性名和spring容器中(配置文件中)的<bean> 的id名称一样,且数据类型是一致的,这样spring能够自动赋值给引用类型,也就不再需要在其他bean中再次声明。

语法:

1
2
3
<bean id="xxx" class="yyy" autowire="byName">
简单类型属性的赋值
</bean>

示例:

某个类中的属性

1
2
3
4
private String name;
private int age;
private int money;
private School school; //school为引用类型的属性名

配置文件:

1
2
3
4
5
6
7
8
9
10
    <bean id="myP" class="com.tothefor.dao.bao2.Person">
<property name="name" value="loong" />
<property name="age" value="234" />
<property name="money" value="34" />
<!-- <property name="school" ref="myS" /> 利用spring的自动注入 -->
</bean>
<bean id="school" class="com.tothefor.dao.bao2.School">
<property name="ad" value="cdut" />
<property name="name" value="ttttttt" />
</bean>

4.2 byType(按类型注入)

Java类中引用类型的数据类型和spring容器中(配置文件中)的<bean> 的class属性是同源关系的,这样能够赋值给引用类型。

同源关系:

  1. java类中引用类型的数据类型和 bean 中的 class 的值是一样的
  1. java类中引用类型的数据类型和 bean 中的 class 的值是父子类关系
  1. java类中引用类型的数据类型和 bean 中的 class 的值是接口和实现类的关系

用法同byName一样,只是将 autowire的值改为 byType 即可。

注意:在byType中,xml配置文件中声明bean只能有一个符合条件的,不能有多余的,否则会报错。如:同一个class,既有符合条件1的bean,又有符合条件2的bean,这时就会报错。

示例:

某个类中的属性

1
2
3
4
private String name;
private int age;
private int money;
private School school; //school为引用类型的属性名

配置文件:

1
2
3
4
5
6
7
8
9
10
11
    <bean id="myP" class="com.tothefor.dao.bao2.Person">
<property name="name" value="loong" />
<property name="age" value="234" />
<property name="money" value="34" />
<!-- <property name="school" ref="myS" /> 利用spring的自动注入 -->
</bean>
<bean id="mySchool" class="com.tothefor.dao.bao2.School">
<property name="ad" value="cdut" />
<property name="name" value="ttttttt" />
</bean>

5.合并多个配置文件

当有多个配置文件时,可以用一个主配置文件将其他配置文件加载进来,主配置文件一般是不定义对象的。

使用方法:

1
2
<import resource="其他配置文件的路径" />
关键字 classpath:表示类路径(相对于target目录下的classes目录),在spring的配置文件中要指定其他文件的位置,需要使用classpath,用来加载文件。

示例:

1
String config = "applicationContext.xml"; //只需要写主配置文件即可
1
2
3
4
5
6
7
8
9
10
11
<?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">


<import resource="classpath:配置文件1路径" />
<import resource="classpath:配置文件2路径" />
<import resource="classpath:配置文件3路径" />

</beans>

其中,还可以使用通配符进行匹配(* :表示任意字符)。

示例:

1
2
<import resource="classpath:a/abc-*.xml" />
<!--匹配所有a目录下的,以 abc- 开头的所有xml文件 。需要注意的是,不能再次将主配置文件加入,否则会出现死循环问题。-->

本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/37592830.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!