1.定义bean1.0
1.1新建一个项目(和之前一样)
1.2在resources下创建applicationContext.xml文件,并添加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 class="com.qfendu.demo.soundsystem.CompactDisc"/></beans>
package com.qfendu.demo.soundsystem;
public class CompactDisc {
public CompactDisc() {
super();
}
public void play(){
System.out.println("applicationspring正在播放");
}
}
package com.qfendu.demo.soundsystem;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationSpring {
public static void main(String[] args) {
System.out.println("applicationgspring is running...");
//读取xml文件,初始化,创建bean对象
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean对象
CompactDisc cd = context.getBean(CompactDisc.class);
cd.play();
}
}
2.定义bean2.0
如果application.xml中有两个相同的bean标签,那么可以在applicationspring.java中直接使用字符串地址,需要强转
<?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 class="com.qfendu.demo.soundsystem.CompactDisc"/>
<bean class="com.qfendu.demo.soundsystem.CompactDisc"/>
</beans>
package com.qfendu.demo.soundsystem;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationSpring {
public static void main(String[] args) {
System.out.println("applicationgspring is running...");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
CompactDisc cd = (CompactDisc) context.getBean("com.qfendu.demo.soundsystem.CompactDisc#0");
cd.play();
}
}
也可以bean标签中使用id
<?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="compactDisc1" class="com.qfendu.demo.soundsystem.CompactDisc"/>
<bean id="compactDisc2" class="com.qfendu.demo.soundsystem.CompactDisc"/>
</beans>
package com.qfendu.demo.soundsystem;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationSpring {
public static void main(String[] args) {
System.out.println("applicationgspring is running...");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
CompactDisc cd = (CompactDisc) context.getBean("compactDisc1");
cd.play();
}
}
3.使用单元测试
创建和以前一样
package com.qfendu.demo.soundsystem;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AppTest {
@Autowired
private CompactDisc compactDisc1;//变量名一定要与bean中的ID一样,才能识别
@Autowired
private CompactDisc compactDisc2;
@Autowired
@Qualifier("compactDisc2")//变量名与beanid不同时使用这个标签也可以识别
private CompactDisc compactDisc3;
@Test
public void test01(){
compactDisc1.play();
compactDisc2.play();
compactDisc3.play();
}
}
4.id与name
applicationContext.xml除了使用id属性还有name属性也可以用
<?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 name="compactDisc1" class="com.qfendu.demo.soundsystem.CompactDisc"/>
<bean name="compactDisc2" class="com.qfendu.demo.soundsystem.CompactDisc"/>
</beans>
name与id的区别:
一个对象可以有多个name,可以只使用一个名字
<bean name="compactDisc1 compactDisc12" class="com.qfendu.demo.soundsystem.CompactDisc"/>
两个名字都使用的方法,只能在getbean中用两个名字(不建议使用)
package com.qfendu.demo.soundsystem;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationSpring {
public static void main(String[] args) {
System.out.println("applicationgspring is running...");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
CompactDisc cd = (CompactDisc) context.getBean("compactDisc1 compactDisc12");
cd.play();
}
}
5.xml中如何进行依赖注入
通过构造函数进行依赖注入
- 元素
- c- 名称空间
1.
新建一个cdplayer类,再到applicationContext.xml中添加bean属性,最后测试。
package com.qfendu.demo.soundsystem;
public class CDPlayer {
private CompactDisc cd;
public CDPlayer() {
super();
}
public CDPlayer(CompactDisc cd) {
this.cd = cd;
System.out.println("cdplayer的有参构造函数" + this.toString());
}
public void play(){
cd.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 name="compactDisc1 compactDisc12" class="com.qfendu.demo.soundsystem.CompactDisc"/>
<bean name="compactDisc2" class="com.qfendu.demo.soundsystem.CompactDisc"/>
<bean id="cdPlayer1" class="com.qfendu.demo.soundsystem.CDPlayer">
<!--ref中填写应用要传递的类id-->
<constructor-arg ref="compactDisc1"></constructor-arg>
</bean>
</beans>
2.1 c- 名称空间
先申明一个c空间,再添加bean
xmlns:c="http://www.springframework.org/schema/c"
<bean id="cdPlayer2" class="com.qfendu.demo.soundsystem.CDPlayer" c:cd-ref="compactDisc2"></bean>
applicationcontest.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
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 name="compactDisc1 compactDisc12" class="com.qfendu.demo.soundsystem.CompactDisc"/>
<bean name="compactDisc2" class="com.qfendu.demo.soundsystem.CompactDisc"/>
<bean id="cdPlayer1" class="com.qfendu.demo.soundsystem.CDPlayer">
<constructor-arg ref="compactDisc1"></constructor-arg>
</bean>
<!--cd是指 private CompactDisc cd;这个参数 ref和上面意思一样-->
<bean id="cdPlayer2" class="com.qfendu.demo.soundsystem.CDPlayer" c:cd-ref="compactDisc2"></bean>
</beans>
2.2 c- 名称空间
bean中使用下标
<!--如果有多个参数就用 _1 -->
<bean id="cdPlayer3" class="com.qfendu.demo.soundsystem.CDPlayer" c:_0-ref="compactDisc2"></bean>
6. 注入简单类型
以上都是复杂类型的装配,简单类型是指字符串,数组,布尔值等。
1.
applicationContext.xml中添加bean
<bean name="compactDisc1 compactDisc12" class="com.qfendu.demo.soundsystem.CompactDisc">
<!--value中的值会直接添加到构造函数中,没有name的话就按默认顺序注入-->
<constructor-arg name="title" value="I Do" />
<constructor-arg name="artist" value="莫文蔚" />
<!--也可以使用index指定位置,按位置注入-->
<constructor-arg index="0" value="I Do" />
<constructor-arg index="1" value="莫文蔚" />
<!--还可以按类型注入,用type-->
<constructor-arg type="java.lang.String" value="I Do" />
<constructor-arg type="java.lang.String" value="莫文蔚" />
</bean>
package com.qfendu.demo.soundsystem;
public class CompactDisc {
private String title;
private String artist;
public CompactDisc() {
super();
System.out.println("compactdisc构造函数。。。" + this.toString());
}
public CompactDisc(String title, String artist) {
this.title = title;
this.artist = artist;
System.out.println("compactdisc有参构造函数。。。" + this.title + "by" +this.artist);
}
public void play(){
System.out.println("applicationspring正在播放"+" " + this.toString() + " " + this.title + "by" + this.artist);
}
}
2.1 c- 名称空间
<bean id="compactDisc2" class="com.qfendu.demo.soundsystem.CompactDisc" c:title="周杰伦的床边故事" c:artist="周杰伦" />
- 2c- 名称空间(不推荐)
<bean id="compactDisc2" class="com.qfendu.demo.soundsystem.CompactDisc" c:_0="周杰伦的床边故事" c:_1="周杰伦" />
7.注入list类型
7.1简单类型
<constructor-arg name="tracks" >
<list>
<value>I DO 1</value>
<value>I DO 2</value>
<value>I DO 3</value>
</list>
</constructor-arg>
private List<String> tracks;
public CompactDisc(String title, String artist, List<String> tracks) {
this.title = title;
this.artist = artist;
this.tracks = tracks;
System.out.println("compactdisc有三个参数的构造函数。。。" + this.toString());
public void play(){
System.out.println("applicationspring正在播放"+" " + this.toString() + " " + this.title + "by" + this.artist);
for (String track : this.tracks){
System.out.println("音乐" + track);
}
}
7.2复杂数据类型
新建一个music类
package com.qfendu.demo.soundsystem;
public class Music {
private String title;
private Integer duration;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Integer getDuration() {
return duration;
}
public void setDuration(Integer duration) {
this.duration = duration;
}
public Music() {
super();
}
public Music(String title, Integer duration) {
this.title = title;
this.duration = duration;
}
}
package com.qfendu.demo.soundsystem;
import java.util.List;
public class CompactDisc {
private String title;
private String artist;
private List<Music> tracks;
public CompactDisc(String title, String artist, List<Music> tracks) {
this.title = title;
this.artist = artist;
this.tracks = tracks;
System.out.println("compactdisc有三个参数的构造函数。。。" + this.toString());
}
public CompactDisc() {
super();
System.out.println("compactdisc构造函数。。。" + this.toString());
}
public CompactDisc(String title, String artist) {
this.title = title;
this.artist = artist;
System.out.println("compactdisc有参构造函数。。。" + this.title + "by" +this.artist);
}
public void play(){
System.out.println("applicationspring正在播放"+" " + this.toString() + " " + this.title + "by" + this.artist);
for (Music track : this.tracks){
System.out.println("音乐" + track.getTitle() + ",时长:" + track.getDuration());
}
}
}
applicationcontest.xml中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
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">
<!--将数据添加到构造函数,简单类型用value-->
<bean id="music1" class="com.qfendu.demo.soundsystem.Music" >
<constructor-arg value="I DO 1" />
<constructor-arg value="270" />
</bean>
<bean id="music2" class="com.qfendu.demo.soundsystem.Music">
<constructor-arg value="I DO 2"/>
<constructor-arg value="270"/>
</bean>
<bean id="music3" class="com.qfendu.demo.soundsystem.Music" >
<constructor-arg value="I DO 3" />
<constructor-arg value="270" />
</bean>
<bean name="compactDisc1 compactDisc12" class="com.qfendu.demo.soundsystem.CompactDisc">
<!--依赖注入,复杂类型用ref-->
<constructor-arg name="tracks" >
<list>
<ref bean="music1"/>
<ref bean="music2"/>
<ref bean="music3"/>
</list>
</constructor-arg>
</bean>
</beans>
8.注入set类型
和上面一样,将数据改成set集合,applicationcontext.xml将改成
这里使用的是LinkedHashSet,是可以保证顺序的
9.注入map类型
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
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="music1" class="com.qfendu.demo.soundsystem.Music" >
<constructor-arg value="I DO 1" />
<constructor-arg value="270" />
</bean>
<bean id="music2" class="com.qfendu.demo.soundsystem.Music">
<constructor-arg value="I DO 2"/>
<constructor-arg value="270"/>
</bean>
<bean id="music3" class="com.qfendu.demo.soundsystem.Music" >
<constructor-arg value="I DO 3" />
<constructor-arg value="270" />
</bean>
<bean name="compactDisc1 compactDisc12" class="com.qfendu.demo.soundsystem.CompactDisc">
<constructor-arg name="title" value="I Do" />
<constructor-arg name="artist" value="莫文蔚" />
<constructor-arg name="tracks" >
<map>
<!--简单数据类型用value-->
<entry key="m1" value-ref="music1" />
<entry key="m2" value-ref="music2" />
<entry key="m3" value-ref="music3" />
</map>
</constructor-arg>
</bean>
</beans>
package com.qfendu.demo.soundsystem;
import java.util.Map;
public class CompactDisc {
private String title;
private String artist;
private Map <String,Music> tracks;
public CompactDisc(String title, String artist, Map<String,Music> tracks) {
this.title = title;
this.artist = artist;
this.tracks = tracks;
System.out.println("compactdisc有三个参数的构造函数。。。" + this.toString());
}
public CompactDisc() {
super();
System.out.println("compactdisc构造函数。。。" + this.toString());
}
public CompactDisc(String title, String artist) {
this.title = title;
this.artist = artist;
System.out.println("compactdisc有参构造函数。。。" + this.title + "by" +this.artist);
}
public void play(){
System.out.println("applicationspring正在播放"+" " + this.toString() + " " + this.title + "by" + this.artist);
for (String key : this.tracks.keySet()) {
System.out.println("key:" + key);
Music music = this.tracks.get(key);
System.out.println("音乐" + music.getTitle() + ",时长" + music.getDuration());
}
}
}
10.注入数组类型
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
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="music1" class="com.qfendu.demo.soundsystem.Music" >
<constructor-arg value="I DO 1" />
<constructor-arg value="270" />
</bean>
<bean id="music2" class="com.qfendu.demo.soundsystem.Music">
<constructor-arg value="I DO 2"/>
<constructor-arg value="270"/>
</bean>
<bean id="music3" class="com.qfendu.demo.soundsystem.Music" >
<constructor-arg value="I DO 3" />
<constructor-arg value="270" />
</bean>
<bean name="compactDisc1 compactDisc12" class="com.qfendu.demo.soundsystem.CompactDisc">
<constructor-arg name="title" value="I Do" />
<constructor-arg name="artist" value="莫文蔚" />
<constructor-arg name="tracks" >
<!--数组类型注入-->
<array>
<ref bean="music1"/>
<ref bean="music2"/>
<ref bean="music3"/>
</array>
</constructor-arg>
</bean>
</beans>
package com.qfendu.demo.soundsystem;
public class CompactDisc {
private String title;
private String artist;
private Music[] tracks;
public CompactDisc(String title, String artist, Music[] tracks) {
this.title = title;
this.artist = artist;
this.tracks = tracks;
System.out.println("compactdisc有三个参数的构造函数。。。" + this.toString());
}
public CompactDisc() {
super();
System.out.println("compactdisc构造函数。。。" + this.toString());
}
public CompactDisc(String title, String artist) {
this.title = title;
this.artist = artist;
System.out.println("compactdisc有参构造函数。。。" + this.title + "by" +this.artist);
}
public void play(){
System.out.println("applicationspring正在播放"+" " + this.toString() + " " + this.title + "by" + this.artist);
for (Music track : this.tracks) {
System.out.println("音乐:" + track.getTitle() + ", 时长:" + track.getDuration());
}
}
}
11.属性注入
属性注入使用的是set注入
<bean id="music2" class="com.qfendu.demo.soundsystem.Music">
<!--属性注入-->
<property name="title" value="爱情废材"/>
<property name="duration" value="305"/>
</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="music1" class="com.qfendu.demo.soundsystem.Music">
<property name="title" value="告白气球"/>
<property name="duration" value="215"/>
</bean>
<bean id="music2" class="com.qfendu.demo.soundsystem.Music">
<property name="title" value="爱情废材"/>
<property name="duration" value="305"/>
</bean>
<bean id="compactDiscl" class="com.qfendu.demo.soundsystem.CompactDisc">
<property name="title" value="周杰伦的床边故事"/>
<property name="artist" value="周杰伦"/>
<property name="tracks">
<!--list,set,map,数组的注入方式和前面的一样-->
<array>
<ref bean="music1"/>
<ref bean="music2"/>
</array>
</property>
</bean>
</beans>
属性注入中注入对象引用
<bean id="CDPlayer1" class="com.qfendu.demo.soundsystem.CDPlayer">
<!--因为这一个cd引用,所以使用ref-->
<property name="cd" ref="compactDiscl" />
</bean>
12.p名称空间注入
比c名称更简单,配置方法相同
xmlns:p="http://www.springframework.org/schema/p"
自变量注入
<bean id="music2" class="com.qfendu.demo.soundsystem.Music" p:title="爱情废材" p:duration="305"/>
引用注入
<bean id="CDPlayer1" class="com.qfendu.demo.soundsystem.CDPlayer" p:cd-ref="compactDiscl"/>
集合和数组不能使用p名称
13.util名称空间注入
解决p空间不能使用集合和数组的问题
<!--直接使用util,让它自动添加配置,map,list,等都相同的方式-->
<util:list id="trackList">
<ref bean="music1"/>
<ref bean="music2"/>
</util:list>
<bean id="compactDiscl" class="com.qfendu.demo.soundsystem.CompactDisc"
p:title="周杰伦的床边故事"
p:artist="周杰伦"
p:tracks-ref="trackList"><!--这里配合util-->
