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();
}
}