IOC原理基本使用(一)

IOC(概念和原理)

1、什么是IOC

  1. 控制反转,把对象创建过程和对象之间的调用过程,交给Spring进行管理
  2. 使用ioc目的:为了耦合度降低

2、IOC底层原理

  1. xml解析、工厂模式、反射

IOC(BeanFactory接口)

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

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

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

  2. ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用

    加载配置文件时候就会把在配置文件对象进行创建

3、ApplicationContext接口有实现类

在这里插入图片描述

IOC操作Bean管理

1、什么是Bean管理

  1. Bean管理指的是两个操作

    Spring创建对象

    Spring注入属性

2、Bean管理操作有两种方式

  1. 基于Xml配置文件的方式实现
  2. 基于注解方式实现

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

1、基于xml方式创建对象

<bean id = "user" class="spring.User"></bean>

id属性:唯一标识

class属性:类全路径

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

2、基于xml方式注入属性

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

    第一种注入方式:使用set方法进行注入

  2. 创建类,定义属性和对应set方法

public class Book{
    private String name;
    private String author;
    public void setName(String name){
        this.name = name;
    }
    public void setAuthor(String author){
        this.author = author;
    }
}

2.在Spring配置文件中配置对象创建,配置属性注入

<bean id="book" calss="spring.Book">
    <!-- 使用propert完成属性注入 
         name:类里面的属性
         value:向属性注入的值-->
 <property name="author" value="达摩老祖"></property>
        <property name="name" value="易筋经"></property>
</bean>

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

  1. 创建类,定义属性,创建属性对应有参数构造方法
public class Order{
    private String name;
    private String address;
    public Order(String name, String address) {
        this.name = name;
        this.address = address;
    }
}
  1. 在spring配置文件中配置
<!-- 构造器注入属性   -->
    <bean id="order" class="spring5.Order">
        <constructor-arg name="name" value="草莓摇摇奶昔"></constructor-arg>
        <constructor-arg name="address" value="河北省石家庄市裕华区"></constructor-arg>
    </bean>
## IOC操作Bean管理(xml注入其他类型属性)

1、字面量

  1. null值
<!-- 注入null值-->
<property name="address">
<null/>
</property>
  1. 属性值包含特殊符号
<!--属性包含特殊符号-->
<![CDATA[]]>

<property name="address">
<value><![CDATA[<<南京>>]]></value>
</property>

2、注入属性-外部bean

  1. 创建两个类service类和dao类
  2. 在service调用dao里面的方法
  3. 在spirng配置文件中进行配置
package spring5.dao;


public interface UserDao {
    public void update();
}
package spring5.dao;


public class UserDaoImpl implements UserDao{

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


import spring5.dao.UserDao;

public class UserService {
    private UserDao userDao;

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

    public void add(){
        System.out.println("service add...............");
        userDao.update();
    }
}
<bean id="userService" class="spring5.service.UserService">
<!--   注入userDao对象
    name属性:类里面属性名称
    ref属性:创建userDao对象的bean标签id
 -->
    <property name="userDao" ref="userDaoImpl"></property>
</bean>
    <bean id="userDaoImpl" class="spring5.dao.UserDaoImpl"></bean>

3、注入属性-内部bean

  1. 一对多关系:部门和员工

    一个部门有多个员工,一个员工属于一个部门

    部门是一,员工是多

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

package spring5.bean;


public class Department {
    private String dname;

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

    @Override
    public String toString() {
        return "Department{" +
                "dname='" + dname + '\'' +
                '}';
    }
}
package spring5.bean;


public class Employees {
    private String ename;
    private String gender;
    private Department department;

    public void setDepartment(Department department) {
        this.department = department;
    }

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

    public void setGender(String gender) {
        this.gender = gender;
    }
    public void add() {
        System.out.println(ename+"::"+gender+"::"+department);
    }
}
package spring5.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring5.bean.Employees;


public class TestBean {
    public static void main(String[] args) {
        new TestBean().testBean();
    }
    public void testBean(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring5\\bean2.xml");
        Employees employees = ac.getBean("employees", Employees.class);
        employees.add();
    }
}
<!--  内部bean  -->
    <bean id="employees" class="spring5.bean.Employees">
        <!--设置两个普通属性-->
        <property name="ename" value="lucy"></property>
        <property name="gender" value=""></property>
        <!--设置对象类型属性-->
        <property name="department" >
            <bean id="department" class="spring5.bean.Department">
                <property name="dname" value="会计部"></property>
            </bean>
        </property>
    </bean>

版权声明:本文为qq_46519708原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。