Spring框架学习

文章40 |   阅读 20128 |   点赞0

来源:https://blog.csdn.net/yerenyuan_pku/category_6457009.html

Spring入门第三讲——Spring中Bean的配置与管理以及分模块开发的配置

x33g5p2x  于2021-12-18 转载在 其他  
字(20.0k)|赞(0)|评价(0)|浏览(493)

《Spring入门第一讲——Spring框架的快速入门》这一讲中,我们已经快速入门了Spring,现在咱就在第一讲的基础上,讲解一下Spring中Bean的相关配置和管理,不过这都是基于XML文件的这种方式哟!温馨提示:初学者如果第一次学习Spring这个框架,那么还是建议先入门Spring再说,因此初学者可以看看我写的Spring入门第一讲,而在本讲中我写的一些代码都是基于第一讲基础上的,初学者猛然看到这讲,必然会感到很不适应的。

Bean的相关配置

<bean>标签中id和name属性的配置

从之前编写的Spring配置文件中,我们可以发现<bean>标签中有一个id属性,其实它还有一个和id属性类似的name属性,根据它俩的值均能得到配置对象。

  • id属性:在Spring配置文件中会有多个bean标签,但它们的id属性值是不能相同的。Bean起名字时,在约束中采用的是ID约束(唯一约束),而且名字必须以字母开始,可以使用字母、数字、连字符、下划线、句号、冒号等,但id属性值绝对不能有特殊符号;
  • name属性:没有使用约束中的唯一约束,理论上name属性值是可以出现重复的,但是这在实际开发中是不可能出现的,而且它里面可以出现特殊字符。其实,在Spring和Struts1框架进行整合的时候,才有可能会用到,例如:

Bean的生命周期的配置

通过配置<bean>标签上的init-method作为Bean被初始化的时候执行的方法,配置destroy-method作为Bean被销毁的时候执行的方法,要想Bean被销毁的时候执行destroy-method属性中配置的方法,那么Bean得是单例创建的(默认即单例创建),而且只有工厂被关闭时,destroy-method属性中配置的方法才能被执行。下面我会通过一个案例来告诉大家Bean的生命周期是怎样的。
首先,在src目录下创建一个com.meimeixia.spring.demo02包,并在该包下创建一个名为CustomerDao的接口。

package com.meimeixia.spring.demo02;

public interface CustomerDao {
	
	public void save();

}

然后,在com.meimeixia.spring.demo02包下创建CustomerDao接口的一个实现类——CustomerDaoImpl.java。

package com.meimeixia.spring.demo02;

public class CustomerDaoImpl implements CustomerDao {
	
	public void setup() {
		System.out.println("CustomerDaoImpl被初始化了......");
	}

	@Override
	public void save() {
		System.out.println("CustomerDaoImpl中的save方法执行了......");	
	}
	
	/* * 工厂被关闭之后,才会调用该方法 */
	public void destroy() {
		System.out.println("CustomerDaoImpl被销毁了......");
	}

}

接着,将CustomerDaoImpl实现类交给Spring来管理,即在配置文件中配置对象的创建。

<?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">
        
	<!-- Spring入门的配置 -->
	<bean id="userDao" class="com.meimeixia.spring.demo01.UserDaoImpl">
		<!-- DI:依赖注入 -->
		<property name="name" value="李二" />
	</bean>
	
	<!-- Spring的bean的生命周期的配置 -->
	<bean id="customerDao" class="com.meimeixia.spring.demo02.CustomerDaoImpl" init-method="setup" destroy-method="destroy" />
	
</beans>

紧接着,在com.meimeixia.spring.demo02包下创建一个SpringDemo02的单元测试类。

package com.meimeixia.spring.demo02;

import org.junit.Test;
import org.springframework.context.ApplicationContext;

public class SpringDemo02 {

	/* * 生命周期的配置 */
	@Test
	public void demo01() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		CustomerDao customerDao = (CustomerDao) applicationContext.getBean("customerDao");
		customerDao.save();
	}
	
}

最后,运行以上demo01单元测试方法,Eclipse控制台就会打印如下内容。

咦!咋destroy-method属性中配置的destroy方法没有被执行呢?这是因为咱的工厂类没有被关闭,那工厂类该咋关闭呢?可以调用ApplicationContext接口的ClassPathXmlApplicationContext这个实现类中的close方法。所以,SpringDemo02单元测试类中的demo01测试方法应该修改为下面的样子。

package com.meimeixia.spring.demo02;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringDemo02 {

	/* * 生命周期的配置 */
	@Test
	public void demo01() {
		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		CustomerDao customerDao = (CustomerDao) applicationContext.getBean("customerDao");
		customerDao.save();
		applicationContext.close();//此时,CustomerDaoImpl这个类是被单例创建的,当工厂类被关闭时,destroy-method属性中配置的方法就能被执行了。 
	}
	
}

此时,运行以上demo01单元测试方法,Eclipse控制台就会打印出如下内容。

上面我说过,要想Bean被销毁的时候执行destroy-method属性中配置的方法,那么前提Bean得是单例创建的,默认即单例创建,就像下面这样。

如果Bean改为了多例模式创建,就像下面这样。

那么当工厂类被关闭时,destroy-method属性中配置的方法也就不会被执行了。你可以试着运行一下demo01单元测试方法,你会发现Eclipse控制台打印出了如下内容。

Bean的作用范围的配置

<bean>标签上有一个scope属性,它代表Bean的作用范围。该属性有五个属性值,分别是:

其中,singleton和prototype这两个属性取值我们必须要弄得很懂,下面我会单独地讲解一下它俩。

singleton

singleton是scope属性的默认值。在我们把CustomerDaoImpl实现类交给Spring来管理时,明确该Bean的scope属性取值为singleton。

接着,在SpringDemo02的单元测试类中编写如下的一个demo02测试方法。

package com.meimeixia.spring.demo02;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringDemo02 {

	/* * 生命周期的配置 */
	@Test
	public void demo01() {
		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		CustomerDao customerDao = (CustomerDao) applicationContext.getBean("customerDao");
		customerDao.save();
		applicationContext.close();//此时,CustomerDaoImpl这个类是被单例创建的,当工厂类被关闭时,destroy-method属性中配置的方法就能被执行了。 
	}
	
	/* * bean的作用范围的配置 */
	@Test
	public void demo02() {
		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		CustomerDao customerDao1 = (CustomerDao) applicationContext.getBean("customerDao");
		System.out.println(customerDao1);
		CustomerDao customerDao2 = (CustomerDao) applicationContext.getBean("customerDao");
		System.out.println(customerDao2);
		
		System.out.println(customerDao1 == customerDao2);//true,bean默认即单例创建
		
		applicationContext.close();
	}
	
}

然后,运行以上demo02单元测试方法,你就会发现Eclipse控制台打印了如下内容。

prototype

如果把CustomerDaoImpl实现类交给Spring来管理时,明确该Bean的scope属性取值为prototype,就像下面这样。

那么此时运行以上demo02单元测试方法,你就会发现Eclipse控制台打印了如下内容。

从上图中,我们就能看出Bean现在是多例模式创建的了。而且工厂类关闭之后,它也没被销毁,因为现在内存里面是有很多个对象,它不知道要销毁哪一个具体的CustomerDaoImpl对象,所以,要想工厂类被关闭之后,Bean被销毁(此时将会执行destroy-method属性中配置的方法),那么Bean得是单例创建的(默认即单例创建)!

Bean的管理

通俗一点说,Spring中Bean的管理即指创建对象时不需要new操作代码实现,而是交给Spring进行配置完成。Spring进行Bean的管理有两种方式,分别是:

  1. 使用配置文件方式实现
  2. 使用注解方式实现

本讲将重点放在第一种方式上,后一种方式后面会讲。

Spring中Bean的实例化方式

Bean交给Spring管理之后,它在创建这些Bean的时候,有以下几种方式:

无参构造方法的方式(默认)

这种方式是Spring实例化Bean的默认方式,指的是在创建对象的时候,Spring会调用类里面的无参数的构造方法实现。这里,我会通过一个案例来讲讲这种方式。首先,在src目录下创建一个com.meimeixia.spring.demo03包,并在该包下创建一个名为Bean1的类。

package com.meimeixia.spring.demo03;

/** * 无参构造方法的方式(默认) * @author liayun * */
public class Bean1 {
	
	public Bean1() {
		System.out.println("Bean1的无参数的构造方法执行了......");
	}
	
}

然后,将以上类交给Spring来管理,所以Spring配置文件就该下面这样写了。

接着,在com.meimeixia.spring.demo03包下创建一个SpringDemo03的单元测试类。

package com.meimeixia.spring.demo03;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringDemo03 {

	/* * 无参构造方法的方式(默认) */
	@Test
	public void demo01() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
		System.out.println(bean1);
	}
	
}

最后,运行以上demo01单元测试方法,你就会发现Eclipse控制台打印了如下内容。

静态工厂实例化的方式

创建一个工厂类,在工厂类中提供一个静态的方法,这个方法返回类的对象,调用工厂类的方法的时候,直接使用类名.方法名称即可以调用。这里,我会通过一个案例来讲讲这种方式。首先,在com.meimeixia.spring.demo03包下创建一个名为Bean2的类。

package com.meimeixia.spring.demo03;

public class Bean2 {
	
	public Bean2() {
		System.out.println("Bean2类中的无参构造方法执行了......");
	}
	
}

然后,在该包下创建一个Bean2Factory工厂类。

package com.meimeixia.spring.demo03;

/* * Bean2的静态工厂 */
public class Bean2Factory {

	public static Bean2 createBean2() {
		System.out.println("Bean2Factory中的方法执行了......");
		return new Bean2();
	}
	
}

接着,将以上工厂类交给Spring来管理,所以Spring配置文件就该写成下面这样。

紧接着,在SpringDemo03的单元测试类中编写如下的一个demo02测试方法。

package com.meimeixia.spring.demo03;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringDemo03 {

	/* * 无参构造方法的方式(默认) */
	@Test
	public void demo01() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
		System.out.println(bean1);
	}
	
	/* * 静态工厂实例化的方式 */
	@Test
	public void demo02() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean2 bean2 = (Bean2) applicationContext.getBean("bean2");
		System.out.println(bean2);
	}
	
}

最后,运行以上demo02单元测试方法,你就会发现Eclipse控制台打印了如下内容。

实例工厂实例化的方式

创建一个工厂类,在工厂类里面提供一个普通的方法,这个方法返回类对象,调用工厂类的方法时,创建工厂类对象,使用对象调用方法即可。这里,我也会通过一个案例来讲讲这种方式。首先,在com.meimeixia.spring.demo03包下创建一个名为Bean3的类。

package com.meimeixia.spring.demo03;

public class Bean3 {
	
	public Bean3() {
		System.out.println("Bean3类中的无参构造方法执行了......");
	}
	
}

然后,在该包下创建一个Bean3Factory工厂类。

package com.meimeixia.spring.demo03;

/** * Bean3的实例工厂 * @author liayun * */
public class Bean3Factory {

	public Bean3 createBean3() {
		System.out.println("Bean3的实例工厂中的方法执行了......");
		return new Bean3();
	}
	
}

接着,将以上工厂类交给Spring来管理,所以Spring配置文件就该写成下面这样。

紧接着,在SpringDemo03的单元测试类中编写如下的一个demo03测试方法。

package com.meimeixia.spring.demo03;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringDemo03 {

	/* * 无参构造方法的方式(默认) */
	@Test
	public void demo01() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
		System.out.println(bean1);
	}
	
	/* * 静态工厂实例化的方式 */
	@Test
	public void demo02() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean2 bean2 = (Bean2) applicationContext.getBean("bean2");
		System.out.println(bean2);
	}
	
	/* * 实例工厂实例化的方式 */
	@Test
	public void demo03() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean3 bean3 = (Bean3) applicationContext.getBean("bean3");
		System.out.println(bean3);
	}
	
}

最后,运行以上demo03单元测试方法,你就会发现Eclipse控制台打印了如下内容。

Spring中Bean的属性注入

实际上,有关Bean的属性注入共有三种方式,下面我分别加以简单的说明。

  • set方法注入

  • 有参数构造注入

  • 接口注入

但是,在Spring框架里面,只支持前两种方式,即set方法注入和有参数构造注入。下面我会对详细地介绍它们。

构造方法的方式注入属性

首先,在src目录下创建一个com.meimeixia.spring.demo04包,并在该包下编写一个Car实体类。

package com.meimeixia.spring.demo04;

public class Car {
	
	private String name;
	private Double price;
	public Car(String name, Double price) {
		super();
		this.name = name;
		this.price = price;
	}
	@Override
	public String toString() {
		return "Car [name=" + name + ", price=" + price + "]";
	}
	
}

然后,在Spring配置文件中对以上JavaBean进行如下配置。

接着,在com.meimeixia.spring.demo04包下创建一个SpringDemo04的单元测试类。

package com.meimeixia.spring.demo04;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/** * 属性注入的方式 * @author liayun * */
public class SpringDemo04 {
	
	/* * 构造方式的属性注入 */
	@Test
	public void demo01() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Car car = (Car) applicationContext.getBean("car");
		System.out.println(car);
	}
	
}

最后,运行以上demo01单元测试方法,你就会发现Eclipse控制台打印了如下内容。

set方法的方式注入属性

我们同样在com.meimeixia.spring.demo04包下编写一个Car2实体类,在类中定义属性,并生成set方法。

package com.meimeixia.spring.demo04;

/** * set方法的属性注入 * * @author liayun * */
public class Car2 {

	private String name;
	private Double price;

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

	public void setPrice(Double price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "Car2 [name=" + name + ", price=" + price + "]";
	}

}

然后,在Spring配置文件中,使用bean标签创建对象,在bean标签里面使用property标签注入属性。即在Spring配置文件中对以上JavaBean进行如下配置。

接着,在SpringDemo04的单元测试类中编写如下的一个demo02测试方法。

package com.meimeixia.spring.demo04;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/** * 属性注入的方式 * @author liayun * */
public class SpringDemo04 {
	
	/* * 构造方式的属性注入 */
	@Test
	public void demo01() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Car car = (Car) applicationContext.getBean("car");
		System.out.println(car);
	}
	
	/* * set方法方式的属性注入 */
	@Test
	public void demo02() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Car2 car2 = (Car2) applicationContext.getBean("car2");
		System.out.println(car2);
	}
	
}

最后,运行以上demo02单元测试方法,你就会发现Eclipse控制台打印了如下内容。

set方法的方式注入对象类型的属性

首先,在com.meimeixia.spring.demo04包下编写一个Employee实体类,在类中定义属性(其中包括一个对象类型的属性),并生成set方法。

package com.meimeixia.spring.demo04;

public class Employee {

	private String name;
	private Car2 car2;
	public void setName(String name) {
		this.name = name;
	}
	public void setCar2(Car2 car2) {
		this.car2 = car2;
	}
	@Override
	public String toString() {
		return "Employee [name=" + name + ", car2=" + car2 + "]";
	}
	
}

然后,在Spring配置文件中对以上JavaBean进行如下配置。

接着,在SpringDemo04的单元测试类中编写如下的一个demo03测试方法。

package com.meimeixia.spring.demo04;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/** * 属性注入的方式 * @author liayun * */
public class SpringDemo04 {
	
	/* * 构造方式的属性注入 */
	@Test
	public void demo01() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Car car = (Car) applicationContext.getBean("car");
		System.out.println(car);
	}
	
	/* * set方法方式的属性注入 */
	@Test
	public void demo02() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Car2 car2 = (Car2) applicationContext.getBean("car2");
		System.out.println(car2);
	}
	
	/* * set方法注入对象的类型 */
	@Test
	public void demo03() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Employee employee = (Employee) applicationContext.getBean("employee");
		System.out.println(employee);
	}
	
}

最后,运行以上demo03单元测试方法,你就会发现Eclipse控制台打印了如下内容。

p名称空间的属性注入方式(Spring2.5版本后提供的方式)

在Spring2.5版本以后,提供了一种p名称空间的属性注入方式。使用这种方式,需要在Spring核心配置文件中的schema约束位置定义p名称空间。

如果使用了这种方式,那么注入属性时就应该像下面这样写。

  • 普通属性:p:属性名称=“值”
  • 对象类型的属性:p:属性名称-ref=“值”

如果要将下面的配置改为p名称空间的属性注入方式,那么该咋改呢?

我们可以像下面这样子改。

如果是下面这样的配置,那么又该怎么改呢?

我们可以像下面这样子改为p名称空间的属性注入方式。

SpEL表达式语言的属性注入(Spring3.0版本后提供的方式)

在Spring3.0版本以后,提供了一种SpEL表达式语言的属性注入方式。SpEL,即Spring Expression Language,翻译过来就是Spring的表达式语言,其语法格式是#{SpEL}。大家可以去Google一下这种SpEL表达式语言的使用案例,下面我也会稍稍举几个案例来讲讲这种方式。
如果要将下面的配置改为SpEL表达式语言的属性注入方式,那么该咋改呢?

我们可以像下面这样子改。

如果是下面这样的配置,那么又该怎么改呢?

我们可以像下面这样子改为SpEL表达式语言的属性注入方式。

除此之外,使用了这种SpEL表达式语言的属性注入方式,还可以调用其他类的属性或者方法。为了验证这一点,这里,我会举一个案例。首先,在com.meimeixia.spring.demo04包下编写一个CarInfo实体类。

package com.meimeixia.spring.demo04;

public class CarInfo {
	
	private String name;

	public String getName() {
		return "摩托车";
	}
	
	public Double calculatorPrice() {
		return Math.random() * 3000;
	}
	
}

然后,在Spring配置文件中对以上JavaBean进行如下配置。

接着,运行以上SpringDemo04单元测试类中的demo02方法,你就会发现Eclipse控制台打印了如下内容。

复杂类型的属性注入(仅做了解)

注入数组类型的属性

首先,在src目录下创建一个com.meimeixia.spring.demo05包,并在该包下编写一个CollectionBean实体类。

package com.meimeixia.spring.demo05;

import java.util.Arrays;

/** * 集合属性的注入 * @author liayun * */
public class CollectionBean {

	private String[] arrs;
	
	public void setArrs(String[] arrs) {
		this.arrs = arrs;
	}
	
	@Override
	public String toString() {
		return "CollectionBean [arrs=" + Arrays.toString(arrs) + "]";
	}

	
}

然后,在Spring配置文件中对以上JavaBean进行如下配置。

接着,在com.meimeixia.spring.demo05包下创建一个SpringDemo05的单元测试类。

package com.meimeixia.spring.demo05;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/** * 集合类型的属性注入 * @author liayun * */
public class SpringDemo05 {

	@Test
	public void demo01() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		CollectionBean collectionBean = (CollectionBean) applicationContext.getBean("collectionBean");
		System.out.println(collectionBean);
	}
	
}

最后,运行以上demo01单元测试方法,你就会发现Eclipse控制台打印了如下内容。

注入List集合类型的属性

首先,将com.meimeixia.spring.demo05包下的CollectionBean类的代码修改成下面这个样子。

package com.meimeixia.spring.demo05;

import java.util.Arrays;
import java.util.List;

/** * 集合属性的注入 * @author liayun * */
public class CollectionBean {

	private String[] arrs;

	private List<String> list;
	
	public void setArrs(String[] arrs) {
		this.arrs = arrs;
	}
	
	public void setList(List<String> list) {
		this.list = list;
	}

	@Override
	public String toString() {
		return "CollectionBean [arrs=" + Arrays.toString(arrs) + ", list=" + list + "]";
	}
	
}

然后,在Spring配置文件中对以上JavaBean进行如下配置。

接着,运行以上SpringDemo05单元测试类的demo01方法,你就会发现Eclipse控制台打印了如下内容。

注入Set集合类型的属性

首先,将com.meimeixia.spring.demo05包下的CollectionBean类的代码修改成下面这个样子。

package com.meimeixia.spring.demo05;

import java.util.Arrays;
import java.util.List;
import java.util.Set;

/** * 集合属性的注入 * @author liayun * */
public class CollectionBean {

	private String[] arrs;

	private List<String> list;
	
	private Set<String> set;
	
	public void setArrs(String[] arrs) {
		this.arrs = arrs;
	}
	
	public void setList(List<String> list) {
		this.list = list;
	}
	
	public void setSet(Set<String> set) {
		this.set = set;
	}

	@Override
	public String toString() {
		return "CollectionBean [arrs=" + Arrays.toString(arrs) + ", list=" + list + ", set=" + set + "]";
	}
	
}

然后,在Spring配置文件中对以上JavaBean进行如下配置。

接着,运行以上SpringDemo05单元测试类的demo01方法,你就会发现Eclipse控制台打印了如下内容。

注入Map集合类型的属性

首先,将com.meimeixia.spring.demo05包下的CollectionBean类的代码修改成下面这个样子。

package com.meimeixia.spring.demo05;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

/** * 集合属性的注入 * @author liayun * */
public class CollectionBean {

	private String[] arrs;

	private List<String> list;
	
	private Set<String> set;
	
	private Map<String, String> map;
	
	public void setArrs(String[] arrs) {
		this.arrs = arrs;
	}
	
	public void setList(List<String> list) {
		this.list = list;
	}
	
	public void setSet(Set<String> set) {
		this.set = set;
	}
	
	public void setMap(Map<String, String> map) {
		this.map = map;
	}

	@Override
	public String toString() {
		return "CollectionBean [arrs=" + Arrays.toString(arrs) + ", list=" + list + ", set=" + set + ", map=" + map
				+ "]";
	}

}

然后,在Spring配置文件中对以上JavaBean进行如下配置。

接着,运行以上SpringDemo05单元测试类的demo01方法,你就会发现Eclipse控制台打印了如下内容。

注入Properties类型的属性

首先,将com.meimeixia.spring.demo05包下的CollectionBean类的代码修改成下面这个样子。

package com.meimeixia.spring.demo05;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

/** * 集合属性的注入 * @author liayun * */
public class CollectionBean {

	private String[] arrs;

	private List<String> list;
	
	private Set<String> set;
	
	private Map<String, String> map;
	
	private Properties properties;
	
	public void setArrs(String[] arrs) {
		this.arrs = arrs;
	}
	
	public void setList(List<String> list) {
		this.list = list;
	}
	
	public void setSet(Set<String> set) {
		this.set = set;
	}
	
	public void setMap(Map<String, String> map) {
		this.map = map;
	}
	
	public void setProperties(Properties properties) {
		this.properties = properties;
	}

	@Override
	public String toString() {
		return "CollectionBean [arrs=" + Arrays.toString(arrs) + ", list=" + list + ", set=" + set + ", map=" + map
				+ ", properties=" + properties + "]";
	}

}

然后,在Spring配置文件中对以上JavaBean进行如下配置。

接着,运行以上SpringDemo05单元测试类的demo01方法,你就会发现Eclipse控制台打印了如下内容。

Spring的分模块开发的配置

Spring中的分模块开发有两种配置方式,为了讲清楚这两种配置方式,咱还得做一些准备工作,将applicationContext.xml文件中有关复杂类型的属性注入的配置单独抽取成另一个名为applicationContext02.xml的配置文件,而且该配置同样在src目录下。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" 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">
        
	<!-- Spring的集合属性的注入 -->
	<bean id="collectionBean" class="com.meimeixia.spring.demo05.CollectionBean">
		<!-- 注入数组类型(和注入List类型是一样的) -->
		<property name="arrs">
			<list>
				<value>狄仁杰</value>
				<value>李元芳</value>
				<value>武则天</value>
			</list>
		</property>
		
		<!-- 注入List集合 -->
		<property name="list">
			<list>
				<value>王朝</value>
				<value>马汉</value>
				<value>张龙</value>
			</list>
		</property>
		
		<!-- 注入set集合 -->
		<property name="set">
			<set>
				<value>aaa</value>
				<value>bbb</value>
				<value>ccc</value>
			</set>
		</property>
		
		<!-- 注入Map集合(这是一种简单的方式) -->
		<property name="map">
			<map>
				<entry key="神探狄仁杰(第一部)" value="狄仁杰" />
				<entry key="神探狄仁杰(第二部)" value="李元芳" />
				<entry key="神探狄仁杰(第三部)" value="武则天" />
			</map>
		</property>
		
		<!-- 注入Properties类型的属性 -->
		<property name="properties">
			<props>
				<prop key="name">宫本一郎</prop>
				<prop key="address">日本</prop>
			</props>
		</property>
	</bean>
	
</beans>

第一种配置方式:在加载配置文件的时候,一次加载多个配置文件

Spring分模块开发的第一种配置方式就是指在加载配置文件的时候,一次加载多个配置文件。

第二种配置方式:在一个配置文件中引入多个配置文件

Spring分模块开发的第二种配置方式就是指在一个配置文件中引入多个配置文件。这样说的话,我们可以在applicationContext.xml文件中引入applicationContext02.xml文件。

相关文章