Spring Framework IOC的使用XML版(一)

准备工作

配置Maven依赖

    <dependencies>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.2</version>
        </dependency>
   
        <!--日志-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>

        <!--单元测试包-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
引入顶层的依赖,它包含的依赖也会被一并引入

创建实体类

User类文件结构如下

User类的内容如下:

public class User {
    private String name;
    private int age;
    private String location;

    public User(String name) {
        this.name = name;
    }

    public User(String name, String location) {
        this.name = name;
        this.location = location;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", location='" + location + '\'' +
                '}';
    }
}

 创建spring配置文件

        在资源目录下创建spring config的XML文件,idea会自动写好必备的编码配置和命名空间如下:

<?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">

实验

1. 配置User类,让IOC容器管理

<!--id的值可以随意取,class是实体类User在类路径java下的全路径-->
<!--这种方式下是spring调用User的无参构造器创建的对象,因此User类要有无参构造器-->
<bean id="user1" class="com.rolin.xml.entity.User"/>

 测试:

    @Test
    public void test1() {
        //ApplicationContext接口类是Spring提供的IOC的实现方式,继承自BeanFactory(Spring内部使用的类,不提供给开发人员使用)
        //ClassPathXMLApplicationContext通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  
        
        //"user1"与xml文件中的id值对应,表示根据"user1"去IOC容器中检索对象,User.class设定返回类型为User
        User user1 = context.getBean("user1", User.class);  //User.class设定返回类型为User
        System.out.println(user1);


        //当配置文件中只有一个<bean>节点的class值是User的全路径时可以不传id值
        //User user2 = context.getBean(User,class);

        //System.out.println(user2);
    }

运行结果如下,没有设置属性值,所以都是默认值:

2. IOC调用set方法注入属性值

<!--这种方式下是spring调用User的无参构造器创建的对象,因此User类要有无参构造函数-->
<bean id="user2" class="com.rolin.xml.entity.User">
    <!--name为User中属性名,value为要set进去的值-->
    <property name="location" value="GZ"/>
    <property name="name" value="rolling"/>
</bean>

结果如下,name和location被赋值: 

  

 

        对于空值和一些特殊符号(如<,>)要特殊处理,如下:

<bean id="user2" class="com.rolin.xml.entity.User">
    <property name="location">
        <!--  null值写法-->
        <null/>
    </property>

    <property name="name">
        <!--  有特殊符号时的写法-->
        <value><![CDATA[<<angel>>]]></value>
    </property>
</bean>

   

 

3. IOC调用有参构造方法注入属性值

<!--容器会根据参数个数和名字调用对应的构造函数-->
<bean id="user3" class="com.rolin.xml.entity.User">
    <constructor-arg name="name" value="bbb"/>

    <!-- index指参数列表的第二个参数,这种方式用的少-->
    <constructor-arg index="1" value="Shanghai"/>
</bean>

   

4. p名称空间(不常见)

      p名称空间是另一种用set方法注入属性值的写法,要在命名空间中加上一条:

xmlns:p="http://www.springframework.org/schema/p"
<bean id="user4" class="com.rolin.xml.entity.User" p:name="fahaxiki" p:age="10"/>

5. 外部bean注入属性

        当要注入的属性是一个自定义类时我们可以采用waibean或者内部bean的方式注入,外部bean写法如下:

        假设有如下两个类UserDAO和UserService,关系如下:

public class UserDAO{
    public void getUp(){
        System.out.println("User get up!");    
    }
}
public class UserService{
    private UserDAO userDAO;

    public void getUp(){
        userDAO.getUp();
    }
}

        要往UserService的属性注入依赖,首先配置UserDAO的bean节点,然后再配置Userservice的bean节点,在<property>节点中添加映射关系,这种方式使得userDAO这个节点可以被映射多次:

<bean id="userDAO" class="com.rolin.entity.UserDAO"/>

<bean id="userService" class="com.rolin.entity.UserService">
    <!--name是UserService类中的属性名,ref是对应的依赖即对应到id="userDAO"的bean节点,将它的对象注入到userService的属性userDAO中-->
    <property name="userDAO" ref="userDAO"/>
</bean>

6. 内部bean注入属性

        作为<property>的子节点<bean>来实现属性注入,这种方式使这个bean节点与包裹它的节点绑定,不能被多次映射到其他bean节点上,如图:

<bean id="userService" class="com.rolin.entity.UserService">
              <!--属性名-->
    <property name="userDAO">
        <bean class="com.rolin.entity.UserDAO"/>
    </property>
</bean>

7. 数组、list、map、set类型的属性注入

        设有如下Student类和Prize类

public class Prize {
    private String prizeName;

    public Prize() {
    }

    public void setPrizeName(String prizeName) {
        this.prizeName = prizeName;
    }

    @Override
    public String toString() {
        return "Prize{" +
                "prizeName='" + prizeName + '\'' +
                '}';
    }
}
public class Student {
    private String[] hobbies;
    private List<String> schedule;
    private Map<String, Integer> marks;
    private Set<Prize> prizes;  //存储的类型为Prize

    public Student() {
    }

    public String[] getHobbies() {
        return hobbies;
    }

    public void setHobbies(String[] hobbies) {
        this.hobbies = hobbies;
    }

    public List<String> getSchedule() {
        return schedule;
    }

    public void setSchedule(List<String> schedule) {
        this.schedule = schedule;
    }

    public Map<String, Integer> getMarks() {
        return marks;
    }

    public void setMarks(Map<String, Integer> marks) {
        this.marks = marks;
    }

    public void setPrizes(Set<Prize> prizes) {
        this.prizes = prizes;
    }

    @Override
    public String toString() {
        return "Student{" +
                "hobbies=" + Arrays.toString(hobbies) +
                ", schedule=" + schedule +
                ", marks=" + marks +
                ", prizes=" + prizes +
                '}';
    }
}
    <bean id="stu1" class="com.rolin.xml.entity.Student">
        <property name="hobbies">
            <array>
                <value>sleeping</value>
                <value>eating</value>
            </array>
        </property>

        <property name="schedule">
            <list>
                <value>study</value>
                <value>learn</value>
            </list>
        </property>

        <property name="marks">
            <map>
                <entry key="CS" value="100"/>
                <entry key="NoSQL" value="100"/>
            </map>
        </property>

        <!--  注入对象-->
        <property name="prizes">
            <set>
                <ref bean="prizes1"/>
                <ref bean="prizes2"/>
            </set>
        </property>
    </bean>

    <bean id="prizes1" class="com.rolin.xml.entity.Prize">
        <property name="prizeName" value="first"/>
    </bean>
    <bean id="prizes2" class="com.rolin.xml.entity.Prize">
        <property name="prizeName" value="second"/>
    </bean>

  

 

资料参考

尚硅谷

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值