【Spring】 核心概念:Ioc Ioc容器 DI

新博客:https://blog.bigdataboy.cn/article/441.html

Ioc / Ioc容器 / DI

需要解决的问题: 解耦不手动 new 对象,而是 容器提供对象

使用 new 对象会产生高耦合,在改动代码后,必须重新编译、打包、部署

Ioc (控制反转)

使用对象时,有主动 new 产生对象转变成外部提供对象。

Ioc容器

外部提供对象的容器就叫 Ioc容器,对象将由 Ioc容器 管理对象,能够管理对象的创建初始化等一系列事情,创建后的对象被称为 Bean

DI(依赖注入)

在容器中建立 BeanBean 之间的依赖关系,这个过程叫做 依赖注入

例子

解决疑问:

  • 怎么实现的不用 new容器管理
  • 容器怎么知道管理什么对象:使用 spring 规定的 xml 配置文件
  • DI 怎么实现的依赖注入:配置项关联

例子

使用 5.2.10.RELEASE 版本

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
</dependencies>

创建 spring 配置(需要加载 maven 依赖后,才会有这个选项)

mark

在 spring 配置 配置文件中添加 bean

id: Bean 的唯一标识

name: Bean 的别名,多个由 空格 逗号 分割

class: 后面是需要容器管理对象的路径

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

    <!--  管理对象  -->
    <bean id="nameDao" class="cn.bigdataboy.dao.impl.NameDaoImpl"/>
</beans>

使用,不用 new 体现在,使用 nameDao 对象不是 new 出来的

package cn.bigdataboy;

import cn.bigdataboy.dao.NameDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App1 {
    public static void main(String[] args) {
        // 传入配置文件路径 不会这么使用,仅举例 
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 从容器获取对象
        NameDao nameDao = (NameDao) context.getBean("nameDao");
        nameDao.getName();
    }
}

业务层的处理需要依赖数据层的对象,需要使用 DI 处理它们的依赖

配置添加属性标签并建立关联

 <!--  管理对象  -->
    <bean id="nameDao" class="cn.bigdataboy.dao.impl.NameDaoImpl"/>
    <bean id="NameService" class="cn.bigdataboy.service.impl.NameServiceImpl">
        <!--
        配置 NameService 类中依赖的 bean
        name 是 NameServiceImpl 类中的 变量名,ref 才是 bean 的 id 关联
        -->
        <property name="nameDao" ref="nameDao"></property>
    </bean>

业务层的类也需要开启一个接口方法,方便容器进行设置

public class NameServiceImpl implements NameService {

    /**
     * 原来业务层需要 new 数据层进行操作
     * private NameDao nameDao = new NameDaoImpl();
     */
    private NameDao nameDao;

    public void save() {
        System.out.println("name service save...");
        nameDao.getName();
    }

    // 相对于开个接口给容器,好能能进行设置
    public void setNameDao(NameDao nameDao) {
        this.nameDao = nameDao;
    }
}

[mark]()

相关代码:https://pan.bigdataboy.cn/s/bDrs0

发表评论 / Comment

用心评论~