Spring IOC(一)

itjavashuai 2020-07-28

Spring之IOC

控制反转,把创建对象的过程交给Spring进行管理。

什么是IOC

控制反转,把创建对象和对象之间的调用过程,交给Spring进行管理。

使用IOC的目的,降低耦合度。

IOC底层原理

xml解析

工厂模式

反射

IOC(BeanFactory接口)

IOC思想基于IOC容器完成,IOC容器底层就是对象工厂。

Spring提供IOC容器实现两种方式(两个接口) 

BeanFactory

IOC容器基本实现,是Spring内部使用的接口,不提供开发人员进行使用。(加载配置文件 的时候不会创建对象,在获取对象(使用)的时候才去创建对象。)

ApplicationContext

BeanFactory接口的子接口。提供更多更强大的功能,一般由开发人员进行使用(加载配置 文件时候就会把在配置文件对象进行创建。)

Spring IOC(一)

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

使用set方法进行注入

public class Book {
    private String bname;
    private String bauthor;

    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 + ‘\‘‘ +
                ‘}‘;
    }
}
<bean id="book" class="cn.xupengzhuang.spring5.pojo.Book">
    <property name="bname" value="五年高考"></property>
    <property name="bauthor" value="张三"></property>
</bean>

使用有参构造函数进行注入

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

    @Override
    public String toString() {
        return "Order{" +
                "oname=‘" + oname + ‘\‘‘ +
                ", address=‘" + address + ‘\‘‘ +
                ‘}‘;
    }
}
<bean id="order" class="cn.xupengzhuang.spring5.pojo.Order">
    <constructor-arg name="oname" value="电脑"></constructor-arg>
    <constructor-arg name="address" value="china"></constructor-arg>
</bean>

IOC操作Bean管理(xml注入其他类型属性)

字面量

null值

属性含有特殊符号

<bean id="book" class="cn.xupengzhuang.spring5.pojo.Book">
    <property name="bname">
        <value><![CDATA[<<Java编程思想>>]]></value>
    </property>
    <property name="bauthor">
        <null/>
    </property>
</bean>

注入属性-外部 bean

public class UserDao {
    public void add(){
        System.out.println("dao add");
    }
}
public class UserService {
    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }

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

    public void add(){
        System.out.println("service add");
        userDao.add();
    }
}
<bean id="userDao" class="cn.xupengzhuang.spring5.dao.UserDao"></bean>

<bean id="userService" class="cn.xupengzhuang.spring5.service.UserService">
    <property name="userDao" ref="userDao"></property>
</bean>

注入属性-内部bean

public class Dept {
    private String dname;

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

    public String getDname() {
        return dname;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "dname=‘" + dname + ‘\‘‘ +
                ‘}‘;
    }
}
public class Emp {
    private String ename;
    private String gender;
    private Dept dept;

    public String getEname() {
        return ename;
    }

    public String getGender() {
        return gender;
    }

    public Dept getDept() {
        return dept;
    }

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

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

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "ename=‘" + ename + ‘\‘‘ +
                ", gender=‘" + gender + ‘\‘‘ +
                ", dept=" + dept +
                ‘}‘;
    }
}
<bean id="emp" class="cn.xupengzhuang.spring5.pojo.Emp">
    <property name="ename" value="jack"></property>
    <property name="gender" value="男"></property>
    <property name="dept">
        <bean id="dept" class="cn.xupengzhuang.spring5.pojo.Dept">
            <property name="dname" value="安保部"></property>
        </bean>
    </property>
</bean>

注入属性-级联赋值

<!--级联赋值-->
<bean id="emp" class="cn.xupengzhuang.spring5.pojo.Emp">
    <property name="ename" value="lucy"></property>
    <property name="gender" value="女"></property>
    <property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="cn.xupengzhuang.spring5.pojo.Dept">
    <property name="dname" value="财务部"></property>
</bean>

第二种写法

<!--级联赋值-->
<bean id="emp" class="cn.xupengzhuang.spring5.pojo.Emp">
    <!--设置两个普通属性-->
    <property name="ename" value="lucy"></property>
    <property name="gender" value="女"></property>
    <!--级联赋值-->
    <property name="dept" ref="dept"></property>
    <property name="dept.dname" value="技术部"></property>
</bean>
<bean id="dept" class="cn.xupengzhuang.spring5.pojo.Dept">
    <property name="dname" value="财务部"></property>
</bean>

Spring IOC(一)

相关推荐