Spring装配Bean ---通过 XML装配Bean

看Spring实战(第4版)笔记    (代码量有很多重复 而且都是很简单的代码,不过 便于下次再看,好理解,就这样重复吧。)

在Spring XML配置中,只有一种声明bean的方式:使用<bean>元素并指定class属性。Spring会从这里获取必要的信息来创建bean。

总结:spring 配置的bean有两种:  声明简单bean 和 声明DI(需要依赖其他bean的复杂bean)

PS:xml配置声明DI 有两种构造器注入 和 setter方法注入 ,这两种注入方式总结如下

     在声明java类时,构造器注入 需要显示定义 构造器;setter方法需要定义 属性的setter方法

     在xml配置文件中,构造器注入是 <constructor-arg> 元素 name属性可选 ;setter方式是<property>元素并且指定name。name = java类属性名

那么这篇文章1 讲XML配置声明简单bean 2 讲XML配置 使用构造器声明DI  3讲XML配置使用setter方法 声明DI     

1.xml配置简单的Bean---定义Bean

public class CompactDisc {
	
	private String artist = "dream_s";
	private String music = "litter bird";
	public void play() {
		System.out.println("XML CONFIG   playing  "+ music + "  by  "+ artist);		
	}
}

1.xml配置简单的Bean---在src目录下 新建xml 配置文件,可以在eclipse中File - New - Spring Bean Configuration File

   创建这个bean的 通过class属性来指定,并且需要使用全限定的类名。 通过id属性来命名(我喜欢全部都重命名,更明了一些)

    这个xml配置文件 = Java 配置中的 使用@Configure注解的 配置类

    使用<bean/>元素 声明一个bean   <bean/> 元素 = Java配置中的@Bean注解

<?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>元素时,它会创建一个CompactDisc实例 -->
 <bean id = "compactDisc" class = "com.demo.SpringBeanDemo.CompactDisc"></bean>
 
</beans>

1.xml配置简单的Bean---测试 Spring可以自动发现 并 创建这个bean

Spring 读取配置文件方法之 FileSystemXmlApplicationContext 参数是 xml配置文件 在 电脑中绝对路径

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

public class CDPlayerTest {

	// 第一步:读配置文件,来创建ApplicationContext
	ApplicationContext context = new FileSystemXmlApplicationContext("D:/workspace/SpringBeanDemo/src/bean-config.xml");
	// 第二步:获取需要操作的bean 
	private CompactDisc compactDisc = (CompactDisc) context.getBean("CompactDisc"); 
	@Test
	public void testPlayer() {
		compactDisc.play();
	}
}

控制台输出---XML CONFIG   playing  litter bird  by  dream_s  

2.XML配置声明DI 之 构造器注入  ---XML配置声明依赖其它Bean的复杂Bean  之 构造器注入    

    XML配置 声明依赖注入(DI)方式有构造器注入和setter方法注入

    其中构造器注入以下讲了四种情况:类型装配,字面量装配,集合装配(包括集合元素是基本数据类型和自定义类型)

    2.1 XML配置声明DI 之 构造器注入 之 类型装配  ---XML配置 声明依赖其它Bean的复杂Bean 之构造器注入 之类型装配   

      首先定义CDPlayer bean时有一个接受CompactDisc类型的构造器

      Spring 通过<bean/>元素的子元素 <constructor-arg>元素 实现构造器注入,  <constructor-arg>元素 ref属性 实现 类型装配   <constructor-arg>元素会告知Spring要将一个ID为compactDisc的 bean引用传递到CDPlayer的构造器中 使用   

package com.demo.SpringBeanDemo;

public class CDPlayer {

    //通过构造器 实现DI功能
    private CompactDisc compactDisc;   
    
	public CDPlayer(CompactDisc compactDisc) {
		this.compactDisc = compactDisc;
	}
	public  void  play() {
		compactDisc.play();		
	}
}
<?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 = "CompactDisc" class = "com.demo.SpringBeanDemo.CompactDisc"></bean>

 <bean id="cdPlayer" class = "com.demo.SpringBeanDemo.CDPlayer">
        <constructor-arg ref="CompactDisc"/> 
 </bean>
</beans>

     测试  XML配置通过构造器实现DI

      控制台输入两遍XML CONFIG   playing  litter bird  by  dream_s

package com.demo.SpringBeanDemo;

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

public class CDPlayerTest {

	// 第一步:读配置文件,来创建ApplicationContext,相当于bean的工厂
	ApplicationContext context = new FileSystemXmlApplicationContext("D:/workspace/SpringBeanDemo/src/bean-config.xml");
	// 第二步:获取需要操作的bean
	private CompactDisc compactDisc = (CompactDisc) context.getBean("CompactDisc");  
        //构造器实现DI
        private CDPlayer cdPlayer = (CDPlayer) context.getBean("cdPlayer"); 
	@Test
	public void testPlayer() {
		compactDisc.play();
		cdPlayer.play();
	}
}

  2.2 XML配置声明DI 之 构造器注入 之 字面量注入 ---XML配置 声明依赖其它Bean的复杂Bean 之构造器注入 之字面量注入
      迄今为止,我们所做的DI通常指的都是类型的装配——也就是将对象的引用装配到依赖于它们的其他对象之中——而有时候,我们需要做的只是用一个字面量值来配置对象

 Spring 使用 <constructor-arg>元素  value属性 实现 字面量装配  通过该属性表明给定的值要以字面量的形式注入到构造器之中

import java.util.List;

public class BlankCompactDisc {

	private String music;
	private String artist;	 

	public BlankCompactDisc(String music, String artist) {
		this.music = music;
		this.artist = artist;
	}
	 
	public void play() {
		System.out.println("XML CONFIG  value DI playing  "+ music + "  by  "+ artist);
	}
}

  xml 配置文件中 把BlankCompactDisc 配置成Spring Bean 

<?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="blankCompactDisc" class="com.demo.SpringBeanDemo.BlankCompactDisc">
                       <!--通过name名称匹配属性-->
		<constructor-arg name= "music" value="please happy today"></constructor-arg>
		<constructor-arg name="artist" value="dream_s"></constructor-arg>	
	</bean>
</beans>

   测试 xml 配置 通过 <constructor-arg>元素 value属性实现 字面量装配注入

  控制台输出 : XML CONFIG  value DI playing  please happy today  by  dream_s

package com.demo.SpringBeanDemo;

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

public class CDPlayerTest {

	ApplicationContext context = new FileSystemXmlApplicationContext("D:/workspace/SpringBeanDemo/src/bean-config.xml");
        private BlankCompactDisc blankCompactDisc =  (BlankCompactDisc) context.getBean("blankCompactDisc"); 
	@Test
	public void testPlayer() {	 
		blankCompactDisc.play();
	}
}

2.3 XML配置声明DI 之 构造器注入 之 装配集合 ---XML配置 声明依赖其它Bean的复杂Bean 之构造器注入 之装配集合

        如果 某个类 有些属性是一个集合,那么通过xml配置把它声明为 Spring Bean时,可以通过<constructor-arg>子元素<list>

如果集合元素 是基本数据类型,可以用子元素<value> 。如果 集合元素 是一个自定义类型,那么可以用子元素<ref>

       例如下面的例子,BlankCompactDisc 有两个属性 都是List集合,一个是基本数据类型Sring,另一个集合是CompactDisc类型。当把它注册为Spring的bean时,xml的写入如下

     声明BlankCompactDisc类,并写构造函数  

package com.demo.SpringBeanDemo;

import java.util.List;

public class BlankCompactDisc {

	private List<String> trackers;
	private List<CompactDisc> compactDiscs;
	
	public BlankCompactDisc(List<String> trackers, List<CompactDisc> compactDiscs) {
		this.trackers = trackers;
		this.compactDiscs = compactDiscs;
	}
	public void play() {
		for (String tracker : trackers) {
			System.out.println("XML CONFIG  List DI playing  "+ tracker);
		}
		for(CompactDisc compactDisc:compactDiscs){
			compactDisc.play();
		}
	}
}

xml配置 为Spring bean

<?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="compactDisc" class="com.demo.SpringBeanDemo.CompactDisc"></bean>

	<bean id="blankCompactDisc" class="com.demo.SpringBeanDemo.BlankCompactDisc">		 
		<constructor-arg>
			<list>
				<value>tracker1</value>
				<value>tracker2</value>
				<value>tracker3</value>
			</list>
		</constructor-arg>
		<constructor-arg>
			<list>
				<ref bean="compactDisc"/>
			</list>
		</constructor-arg>
	</bean>
</beans>

  测试 xml配置 时装配集合,包括集合内元素是 基本数据类型 和 自定义类型

package com.demo.SpringBeanDemo;

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

public class CDPlayerTest {

	ApplicationContext context = new FileSystemXmlApplicationContext("D:/workspace/SpringBeanDemo/src/bean-config.xml");
    private BlankCompactDisc blankCompactDisc =  (BlankCompactDisc) context.getBean("blankCompactDisc"); 
	@Test
	public void testPlayer() {	 
		blankCompactDisc.play();
	}
}

   控制台输出:

XML CONFIG  List DI playing  tracker1
XML CONFIG  List DI playing  tracker2
XML CONFIG  List DI playing  tracker3
XML CONFIG   playing  litter bird  by  dream_s

3 XML配置声明DI 之 setter方法注入     

     xml配置声明DI 有两种构造器注入 和 setter方法注入 ,这两种注入方式总结如下

     在声明java类是,构造器注入 需要显示定义 构造器;setter方法需要定义 属性的setter方法

     在xml配置文件中,构造器注入是 <constructor-arg> 元素 name属性可选 ;setter方式是<property>元素并且指定name。name = java类属性名

      setter注入也包括: 类型注入,字面量注入,集合注入 直接贴例子如下

定义Java类时 显示定义setter方法

package com.demo.SpringBeanDemo;

import java.util.List;

public class BlankCompactDisc {
    private CompactDisc compactDisc; //1.类型注入
	private String artist ; //2.字面量注入
	private String music;
    private List<String> trackers; //3.集合 注入  集合元素是基本数据类型(字面量)
	private List<CompactDisc> compactDiscs; //4集合注入 集合元素是自定义类型
    
	public void setCompactDisc(CompactDisc compactDisc) {
		this.compactDisc = compactDisc;
	}
	public void setArtist(String artist) {
		this.artist = artist;
	}
	public void setMusic(String music) {
		this.music = music;
	}
	public void setTracker(List<String> trackers) {
		this.trackers = trackers;
	}
	public void setCompactDiscs(List<CompactDisc> compactDiscs) {
		this.compactDiscs = compactDiscs;
	}
	public void play() {
		//测试setter方法 类型注入
		compactDisc.play();
		//测试setter方法字面量注入
		System.out.println("XML CONFIG   playing  "+ music + "  by  "+ artist);		
		//测试setter方法 集合装配 集合元素是基本数据类型(字面量)
		for (String tracker : trackers) {
			System.out.println("this is tracker: "+tracker);
		}
		//测试setter方法 集合装配 集合元素是自定义类型
		for (CompactDisc compactDisc : compactDiscs) {
			compactDisc.play();
		}
	}
}

 xml配置文件中 把java类声明成spring bean时使用 <property>属性

<?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="compactDisc" class="com.demo.SpringBeanDemo.CompactDisc"></bean>

	<bean id="blankCompactDisc" class="com.demo.SpringBeanDemo.BlankCompactDisc">	
	     <!-- 类型注入  name属性值 是 类定义中的属性名  ref属性值 是所引用的bean id-->
	     <property name="compactDisc" ref="compactDisc"></property>
	     <!--字面量注入 name属性值 是 类定义中的属性名  -->
	     <property name="music"  value="happy"> </property>	 
		 <property name="artist"   value="dream_s"></property>
		 <!-- 集合注入  字面量集合-->
		 <property name="tracker">
			 <list>
				 <value>tracker 1</value>
				 <value>tracker 2</value>
			 </list>
		 </property>
		 <!-- 集合注入  自定义类型集合 ref元素 bean属性-->
		 <property name="compactDiscs">
			 <list>
				 <ref bean="compactDisc"></ref>
			 </list>
		 </property>
 	</bean>
</beans>

测试代码 和构造器注入的测试 代码一样

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

public class CDPlayerTest {

	ApplicationContext context = new FileSystemXmlApplicationContext("D:/workspace/SpringBeanDemo/src/bean-config.xml");
    private BlankCompactDisc blankCompactDisc =  (BlankCompactDisc) context.getBean("blankCompactDisc"); 
	@Test
	public void testPlayer() {	 
		blankCompactDisc.play();
	}
}

 

posted on 2019-04-15 15:00  dreamstar  阅读(90)  评论(0编辑  收藏  举报