IOC操作Bean和属性注入

IOC操作Bean管理

1、什么是Bean管理?
Bean管理指的是两个操作
(1)Spring创建对象
(2)Spring注入属性

2、Bean管理操作有两种方式
(1)基于xml配置文件方式实现
(2)基于注解方式实现

IOC操作Bean管理(基于xml方式)

1、基于xml方式创建对象

    <!--配置Hello对象创建和注入属性-->
    <bean id="hello" class="com.lu.Hello">
    </bean>

(1)在Spring配置文件中,使用bean标签,标签里添加对应的属性,就可以实现对象的创建。

(2)在bean标签中有很多属性,例如:
id属性:唯一标识
class属性:类全路径

(3)创建对象的时候,默认是执行无参构造方法完成对象创建。

2、基于xml方式注入属性

DI:依赖注入,就是注入属性

2.1、第一种方式:set方式

使用property完成属性注入
name:类里面的属性名称
value:向属性注入的值

    <!--配置Hello对象创建和注入属性-->
    <bean id="hello" class="com.lu.Hello">
    <!--使用property完成属性注入
        name:类里面的属性名称
        value:向属性注入的值-->
        <property name="name" value="Hello Spring"/>
    </bean>

2.2、第二种方式:使用有参构造进行注入

(1) 创建类,定义属性,创建属性对应的有参构造方法

(2)在Spring配置文件中进行配置

因为默认是走的无参构造,所以这次用 constructor-arg 标签,走有参构造。
这个标签中也有两种方式,一是常用的通过属性名,二是通过有参构造的位置(从0开始)

    <bean id="student" class="com.lu.Student">
        <!--方式一:通过属性名。常用-->
        <constructor-arg name="ID" value="2020"/>
        <constructor-arg name="name" value="张三"/>
        
        <!--方式二:通过参数位置,从0开始。不常用-->
        <constructor-arg index="0" value="2020-index"/>
        <constructor-arg index="1" value="张三-index"/>
    </bean>

2.3、补充:P名称空间注入(了解)

(1)使用p名称空间注入,可以简化基于xml配置方式
第一步:在配置文件中添加p名称空间
在这里插入图片描述

第二步:进行属性注入,在bean标签里面进行操作

    <!--set方法注入属性-->
    <bean id="student" class="com.lu.Student" p:ID="2020" p:name="张三"> </bean>

3、注入空值和特殊符号

3.1、注入空值

    <bean id="student" class="com.lu.Student">
        <property name="ID" value="2020"/>

        <!--注入空值-->
        <property name="name">
            <null/>
        </property>
    </bean>

3.2、属性值包含特殊符号
方法一是将特殊符号进行转义。

方法二是使用<![CDATA[ ]]>特殊标签

    <bean id="student" class="com.lu.Student">
        <property name="ID" value="2020"/>
        <!--注入<<张三>>,使用<![CDATA[ ]]>标签-->
        <property name="name">
            <value><![CDATA[<<张三>>]]></value>
        </property>
    </bean>

4、注入外部bean(即注入对象)

(1)创建两个类service类和dao类
(2)在service中调用dao里面的方法
(3)在spring配置文件中进行配置

代码:
UserDao和UerDaoImpl类正常写。

UserService类:

package com.lu.service;

import com.lu.dao.UserDao;
import com.lu.dao.UserDaoImpl;

public class UserService {
    
    

    //现在:创建UserDao类型属性,生产get方法
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
    
    
        this.userDao = userDao;
    }

    public void add(){
    
    
        System.out.println("service add 执行了");

        //现在:注入后,直接可以使用对象和对象的方法
        userDao.update();

        //原始方法
        //UserDao userDao = new UserDaoImpl();
        //userDao.update();
    }
}

beans.xml:
外部bean是,内部用 ref 引用外部bean标签

    <!--创建service和dao对象-->
    <bean id="userService" class="com.lu.service.UserService">

        <!--注入userDao对象
        name属性值:类里面的属性名称
        ref属性:创建userDao对象bean标签id-->
        <property name="userDao" ref="userDaoImpl"/>
    </bean>

    <!--因为UserDao是接口,不能new,所以要找它的实现类-->
    <bean id="userDaoImpl" class="com.lu.dao.UserDaoImpl"></bean>

5、注入属性-内部Bean和级联赋值

5.1、内部Bean
(1)一对多关系:部门和员工
一个部门有多个员工,一个员工属于一个部门
部门是一,员工是多

(2)在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示

(3)在spring配置文件中进行配置

代码:
Dept类

package com.lu.bean;

//部门类
public class Dept {
    
    
    private String dname;

    public void setDname(String dname) {
    
    
        this.dname = dname;
    }

    @Override
    public String toString() {
    
    
        return "Dept{" +
                "dname='" + dname + '\'' +
                '}';
    }
}

Emp类

package com.lu.bean;

//员工类
public class Emp {
    
    
    private String ename;
    private String gender;

    //员工属于某一个部门,使用对象形式表示
    private Dept dept;
    public void setDept(Dept dept) {
    
    
        this.dept = dept;
    }

    public void setEname(String ename) {
    
    
        this.ename = ename;
    }

    public void setGender(String gender) {
    
    
        this.gender = gender;
    }

    public void print(){
    
    
        System.out.println(ename+"--"+gender+"--"+dept);
    }
}

beans.xml
下边,内部bean,是bean标签又嵌套了一个bean标签。

    <!--内部bean-->
    <bean id="emp" class="com.lu.bean.Emp">
        <!--设置两个普通属性-->
        <property name="ename" value="lucy"/>
        <property name="gender" value=""/>

        <!--设置对象类型属性-->
        <property name="dept">
            <bean id="dept" class="com.lu.bean.Dept">
                <property name="dname" value="技术部"/>
            </bean>
        </property>
    </bean>

5.2、级联赋值
(1)第一种写法:在5.1中的类都不变,修改配置文件,类似外部bean

    <!--级联赋值-->
    <bean id="emp" class="com.lu.bean.Emp">
        <!--设置两个普通属性-->
        <property name="ename" value="lucy"/>
        <property name="gender" value=""/>
        <!--级联赋值-->
        <property name="dept" ref="dept"/>
    </bean>

    <bean id="dept" class="com.lu.bean.Dept">
        <property name="dname"  value="财务部"/>
    </bean>

(2)第二种写法:

在Emp类中生成dept的get方法

    public Dept getDept() {
    
    
        return dept;
    }

配置文件beans.xml
通过ref连接外部bean后,可以直接在内部用name=对象.属性赋值

    <!--级联赋值-->
    <bean id="emp" class="com.lu.bean.Emp">
        <!--设置两个普通属性-->
        <property name="ename" value="lucy"/>
        <property name="gender" value=""/>
        <!--级联赋值-->
        <property name="dept" ref="dept"/>
        <property name="dept.dname" value="技术部"  />
    </bean>

    <bean id="dept" class="com.lu.bean.Dept"></bean>

6、xml注入集合属性:集合、List、Map、Set

6.1、注入集合、List、Map、Set类型属性。
(1)编写 Stu类,写set方法:

package com.lu;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Stu {
    
    
    //1、数组类型
    private String[] courses;

    //2、list集合类型
    private List<String> list;

    //3、map集合类型
    private Map<String,String> maps;

    //4、set集合类型
    private Set<String> sets;

    public void setCourses(String[] courses) {
    
    
        this.courses = courses;
    }

    public void setList(List<String> list) {
    
    
        this.list = list;
    }

    public void setMaps(Map<String, String> maps) {
    
    
        this.maps = maps;
    }

    public void setSets(Set<String> sets) {
    
    
        this.sets = sets;
    }

    @Override
    public String toString() {
    
    
        return "Stu{" +
                "courses=" + Arrays.toString(courses) +
                ", list=" + list +
                ", maps=" + maps +
                ", sets=" + sets +
                '}';
    }
}

配置文件xml:

    <!--集合属性注入-->
    <bean id="stu" class="com.lu.Stu">

        <!--数组类型属性注入-->
        <property name="courses">
            <array>
                <value>java-array</value>
                <value>mysql-array</value>
            </array>
        </property>

        <!--list类型属性注入-->
        <property name="list">
            <list>
                <value>张三-list</value>
                <value>李四-list</value>
            </list>
        </property>

        <!--map类型属性注入-->
        <property name="maps">
            <map>
                <entry key="JAVA" value="java-map"/>
                <entry key="MYSQL" value="mysql-map"/>
            </map>
        </property>

        <!--set类型属性注入-->
        <property name="sets">
            <set>
                <value>mysql-set</value>
                <value>redis-set</value>
            </set>
        </property>
    </bean>

6.2、在集合里面设置对象类型值
(1)需要在创建一个类,并写上set方法

package com.lu;

//课程类
public class Course {
    
    
    private String cname;

    public void setCname(String cname) {
    
    
        this.cname = cname;
    }

    @Override
    public String toString() {
    
    
        return "Course{" +
                "cname='" + cname + '\'' +
                '}';
    }
}

(2)在stu类中添加属性和set注入,重新生成tostring,要不显示不出来

    private List<Course> courseList;
    public void setCourseList(List<Course> courseList) {
    
    
        this.courseList = courseList;
    }

(3)配置文件

	<!--注入list集合类型,值是对象-->
	 <property name="courseList">
	      <list>
	          <ref bean="course"/>
	          <ref bean="course2"/>
	      </list>
	  </property>

    <!--被注入的两个对象-->
    <bean id="course" class="com.lu.Course">
        <property name="cname" value="spring框架"/>
    </bean>
    <bean id="course2" class="com.lu.Course">
        <property name="cname" value="mybatis框架"/>
    </bean>

6.3、把集合注入部分提取出来
(1)在spring配置文件中引入名称空间util, 如下图:

在这里插入图片描述
引用名称空间util,使用util标签完成list集合注入提取。完整配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"

       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd

       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util.xsd">

    <!--1、提取list集合类型属性注入-->
    <util:list id="bookList">
        <value>java</value>
        <value>python</value>
        <value>mysql</value>
    </util:list>
    
    <!--2、提取list集合类型属性注入-->
    <bean id="book" class="com.lu.Book">
        <property name="list" ref="bookList"/>
    </bean>
</beans>

Book类

package com.lu;

import java.util.List;

public class Book {
    
    
    private List<String> list;

    public void setList(List<String> list) {
    
    
        this.list = list;
    }

    //输出方法
    public void printTest(){
    
    
        System.out.println(list);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42524288/article/details/108861369