1.定义bean1.0

1.1新建一个项目(和之前一样)

1.2在resources下创建applicationContext.xml文件,并添加bean标签

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!--添加类的地址-->
  6. <bean class="com.qfendu.demo.soundsystem.CompactDisc"/>
  7. </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="周杰伦" />
  1. 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-->