新博客:https://blog.bigdataboy.cn/article/441.html
Ioc / Ioc容器 / DI
需要解决的问题:
解耦
,不手动 new 对象
,而是容器提供对象
。
使用 new 对象会产生高耦合,在改动代码后,必须重新编译、打包、部署
Ioc (控制反转)
使用对象时,有
主动 new
产生对象转变成外部提供
对象。
Ioc容器
外部提供对象的容器就叫
Ioc容器
,对象将由Ioc容器 管理对象
,能够管理对象的创建
、初始化
等一系列事情,创建后的对象被称为Bean
DI(依赖注入)
在容器中建立
Bean
与Bean
之间的依赖关系
,这个过程
叫做 依赖注入
例子
解决疑问:
- 怎么实现的
不用 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 依赖后,才会有这个选项)
在 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;
}
}
[]()
版权声明:《 【Spring】 核心概念:Ioc Ioc容器 DI 》为明妃原创文章,转载请注明出处!
最后编辑:2022-9-11 11:09:05