Spring框架学习:IOC操作Bean管理-对象创建和属性赋值(四)

IOC操作Bean管理(概念)

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

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

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

一:对象创建

<!--配置User对象创建-->
    <bean id="user" class="com.spring5.User"></bean>

(1)在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
(2)在bean标签有很多属性,介绍常用的属性:
id 属性:唯一标识,别名
class 属性:类全路径(包类路径)
(3)创建对象时候,默认也是执行无参数构造方法完成对象创建

二:基于xml方式注入属性

DI(Dependency Injection):依赖注入,就是注入属性

spring两种注入方式:

1.第一种方式,set方法进行注入

public class Book {
    //创建属性
    private String bname;
    private String bauthor;

    //创建属性对应的set方法注入
    public void setBname(String bname) {
        this.bname = bname;
    }

    public void setBauthor(String bauthor) {
        this.bauthor = bauthor;
    }
    @Override
    public String toString() {
        return "Book{" +
                "bname='" + bname + '\'' +
                ", bauthor='" + bauthor + '\'' +
                '}';
    }
}
<!--set方法注入属性-->
    <bean id="book" class="com.spring5.Book">
        <!--使用property完成属性注入
            name: 类里面属性名称
            value: 向属性注入的值-->
        <property name="bname" value="时间简史"></property>
        <property name="bauthor" value="霍金"></property>
    </bean>

junit测试:

@Test
    public void testSetMethod(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean1.xml");
        Book book = ac.getBean("book", Book.class);
        System.out.println(book.toString());
    }

测试结果:

Book{bname='时间简史', bauthor='霍金'}

2.第二种方式,有参数构造进行注入

public class Orders {
    //属性
    private String oname;
    private String address;
    //有参构造
    public Orders(String oname, String address) {
        this.oname = oname;
        this.address = address;
    }

    @Override
    public String toString() {
        return "Orders{" +
                "oname='" + oname + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
<!--有参构造注入属性-->
    <bean id="orders" class="com.spring5.Orders">
        <constructor-arg name="oname" value="手机"></constructor-arg>
        <constructor-arg name="address" value="中国"></constructor-arg>
        <!--还可以通过index 顺序设置值-->
        <!--<constructor-arg index="0" value=""></constructor-arg>-->
    </bean>

junit测试:

@Test
    public void testConstructor(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean1.xml");
        Orders orders = applicationContext.getBean("orders", Orders.class);
        System.out.println(orders);
    }

测试结果:

Orders{oname='手机', address='中国'}

3.set方法另一种注入方式,p名称空间注入

添加p名称空间

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

属性注入

<!--p名称空间注入-底层还是set注入-->
    <bean id="book" class="com.spring5.Book" p:bname="百年孤独" p:bauthor="加西亚">
    </bean>

字面量

(1)null值

<!--null值-->
        <property name="address">
            <null/>
        </property>

(2)属性包含特殊符号

<!--属性值包含特色符号
            1.转义 < >
            2.CDATA-->
        <property name="address">
            <value>
                <![CDATA[<<上海>>]]>
            </value>
        </property>

注入属性-外部bean

(1)创建两个类service类和dao类
(2)在service调用dao里面的方法

public class UserService {

//    创建UserDao类型属性 生成set方法
    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();
    }
}
public interface UserDao {
    public void update();
}
public class UserDaoImpl implements UserDao {

    @Override
    public void update() {
        System.out.println("dao update.......");
    }
}

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

<!--1. service和dao对象创建-->
    <bean id="userService" class="com.spring5.service.UserService">
        <!--注入userDao对象
            name属性:类里面属性名称
            ref属性:创建userDao对象bean标签id值-->
        <property name="userDao" ref="userDao"></property>
    </bean>

    <!--userDao 是接口,class 找它的实现类-->
    <bean id="userDao" class="com.spring5.dao.UserDaoImpl"></bean>

注入属性-内部bean

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

//部门类
public class Dept {

    private String dname;

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

    @Override
    public String toString() {
        return "Dept{" +
                "dname='" + dname + '\'' +
                '}';
    }
}
//员工类
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;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "ename='" + ename + '\'' +
                ", gender='" + gender + '\'' +
                ", dept=" + dept +
                '}';
    }
}

(3)spring配置文件

<!--内部bean-->
    <bean id="emp" class="com.spring5.bean.Emp">
        <!--普通属性-->
        <property name="ename" value="Tom"></property>
        <property name="gender" value="男"></property>
        <!--设置对象类型属性-->
        <property name="dept">
            <bean id="dept" class="com.spring5.bean.Dept">
                <property name="dname" value="客服部"></property>
            </bean>
        </property>
    </bean>

(4)junit测试

@Test
    public void test2(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean3.xml");
        Emp emp = applicationContext.getBean("emp", Emp.class);
        System.out.println(emp.toString());
    }

测试结果

Emp{ename='Tom', gender='男', dept=Dept{dname='客服部'}}

注入属性-级联赋值

第一种方式:

<!--级联赋值-->
    <bean id="emp" class="com.spring5.bean.Emp">
        <!--普通属性-->
        <property name="ename" value="Tom"></property>
        <property name="gender" value="男"></property>
        <!--设置对象类型属性-->
        <property name="dept" ref="dept"></property>
    </bean>

    <bean id="dept" class="com.spring5.bean.Dept">
        <property name="dname" value="客服部"></property>
    </bean>

第二种方式

  //员工属于某一个部门
    private Dept dept;
    //级联赋值需要get方法
    public Dept getDept() {
        return dept;
    }
    <!--级联赋值-->
    <bean id="emp" class="com.spring5.bean.Emp">
        <!--普通属性-->
        <property name="ename" value="Tom"></property>
        <property name="gender" value="男"></property>
        <!--设置对象类型属性-->
        <property name="dept" ref="dept"></property>
        <property name="dept.dname" value="技术部"></property>
    </bean>

    <bean id="dept" class="com.spring5.bean.Dept">
<!--        <property name="dname" value="客服部"></property>-->
    </bean>

xml注入集合属性

(1)注入数组类型属性
(2)注入List集合类型属性
(3)注入Map集合类型属性

public class Stu {

    //1 数组类型属性
    private String[] courses;

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

    // 3 Map类型属性
    private Map<String,String> map;

    //3 Set 类型属性
    private Set<String> sets;

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

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

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

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

    @Override
    public String toString() {
        return "Stu{" +
                "courses=" + Arrays.toString(courses) +
                ", list=" + list +
                ", map=" + map +
                ", sets=" + sets +
                '}';
    }
}
    <!--集合类型属性注入-->
    <bean id="stu" class="com.spring5.collectiontype.Stu">
        <!--数组类型属性注入-->
        <property name="courses" >
            <!--可以使用list或者array标签-->
           <!-- <list></list>-->
            <array>
                <value>数学</value>
                <value>应用</value>
            </array>
        </property>

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

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

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

junit测试

@Test
    public void testCollection(){

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean1.xml");
        Stu stu = applicationContext.getBean("stu", Stu.class);

        System.out.println(stu.toString());
    }

测试结果

Stu{courses=[数学, 应用], list=[张三, 李四], map={JAVA=java, PHP=php}, sets=[MySQL, Redis]}

细节一:在集合里面设置对象属性值

//课程类
public class Course {

    private String cname;

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

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

Stu类添加:

//学生所学多门课程
   private List<Course> courseList;
    public void setCourseList(List<Course> courseList) {
        this.courseList = courseList;
    }

要注入的对象

<bean id="course1" class="com.spring5.collectiontype.Course">
        <property name="cname" value="数学"></property>
    </bean>
    <bean id="course2" class="com.spring5.collectiontype.Course">
        <property name="cname" value="美术"></property>
    </bean>

对象属性注入

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

细节二:把集合注入公共部分提取出来

Book类:

public class Book {

    private List<String> list;

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

    @Override
    public String toString() {
        return "Book{" +
                "list=" + list +
                '}';
    }
}

添加util名称空间:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       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">
        <!--对象-->
        <!-- <ref></ref>-->
        <value>语文书</value>
        <value>数学书</value>
        <value>英语书</value>
    </util:list>

    <!--2.提取的公共部分 注入使用-->
    <bean id="book" class="com.spring5.collectiontype.Book">
        <property name="list" ref="bookList"></property>
    </bean>

junit测试:

 @Test
    public void testCollection2(){

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean2.xml");
        Book book = applicationContext.getBean("book", Book.class);

        System.out.println(book.toString());
    }

测试结果:

Book{list=[语文书, 数学书, 英语书]}
暂无评论

发送评论 编辑评论


				
上一篇
下一篇