Salmon的全栈知识 Salmon的全栈知识
首页
  • JavaSE
  • JavaWeb
  • Spring生态
  • JUC
  • JVM
  • Netty
  • Java各版本特性
  • 23种设计模式
  • Maven
  • Java常用框架
  • Dubbo
  • OpenFeign
  • Nacos
  • Zookeeper
  • Sentinel
  • Seata
  • SpringCloud Gateway
  • Apollo
  • Eureka
  • Go基础
  • Gin
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
    • ElasticSearch
  • 消息中间件

    • RabbitMQ
    • RocketMQ
    • Kafka
    • ActiveMQ
    • MQTT
    • NATS
  • 网关中间件

    • Nginx
  • Linux
  • Docker
  • Git
  • K8s
  • Solidity
  • Java
  • 计算机网络
  • 操作系统
GitHub (opens new window)
首页
  • JavaSE
  • JavaWeb
  • Spring生态
  • JUC
  • JVM
  • Netty
  • Java各版本特性
  • 23种设计模式
  • Maven
  • Java常用框架
  • Dubbo
  • OpenFeign
  • Nacos
  • Zookeeper
  • Sentinel
  • Seata
  • SpringCloud Gateway
  • Apollo
  • Eureka
  • Go基础
  • Gin
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
    • ElasticSearch
  • 消息中间件

    • RabbitMQ
    • RocketMQ
    • Kafka
    • ActiveMQ
    • MQTT
    • NATS
  • 网关中间件

    • Nginx
  • Linux
  • Docker
  • Git
  • K8s
  • Solidity
  • Java
  • 计算机网络
  • 操作系统
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Spring框架

    • 传统Javaweb开发的困惑
    • IoC、DI和AOP思想提出
      • 1、IoC 控制反转思想的提出
        • 1.1、谁去充当第三方角色呢?
        • 1.2、BeanFactory怎么知道产生哪些Bean实例呢?
      • 2、DI 依赖注入思想的提出
        • 2.1、该方式是否存在一些问题?
        • 2.2、面试题:IoC 和 DI 的关系?
      • 3、AOP 面向切面思想的提出
        • 3.1、AOP简介
        • 3.2、三种思想总结
      • 4、框架概念的出现
        • 4.1、框架的基本特点:
        • 4.2、Java中常用的框架:
      • 5、思想、框架和编码关系
    • Spring框架的诞生
    • 基于xml的Spring应用
    • 基于注解的Spring应用
    • AOP 简介
    • 基于xml配置的AOP
    • 基于注解配置的AOP
    • 基于AOP的声明式事务控制
  • SpringMVC框架

    • Spring整合web环境
    • web层MVC框架思想与设计思路
    • SpringMVC简介
    • SpringMVC的请求处理
    • SpringMVC的响应处理
    • SpringMVC的拦截器
    • SpringMVC的全注解开发
    • SpringMVC的组件原理剖析
    • SpringMVC的异常处理机制
  • 《Spring生态》笔记
  • Spring框架
Salmon
2025-07-23
目录

IoC、DI和AOP思想提出

# 1、IoC 控制反转思想的提出

实际开发中,对象之间的耦合关系,就类似手表内部的齿轮,每个齿轮都紧密啮合在一起,一旦某个齿轮发生故障,那么整个系统也意味着崩溃。尽可能让对象之间的关系保持松耦合状态是我们期望的。

image-20250723231645327

IoC思想: Inversion of Control,翻译为“控制反转”或“反转控制”,强调的是原来在程序中创建Bean的权利反转给第三方。

例如:原来在程序中手动的去 new UserServiceImpl(),手动的去new UserDaoImpl(),而根据IoC思想的指导,寻求一个第三方去创建UserServiceImpl对象和UserDaoImpl对象。这样程序与具体对象就失去的直接联系。

# 1.1、谁去充当第三方角色呢?

工厂设计模式,BeanFactory来充当第三方的角色,来产生Bean实例

# 1.2、BeanFactory怎么知道产生哪些Bean实例呢?

可以使用配置文件配置Bean的基本信息,BeanFactory根据配置文件来生产Bean实例

image-20250723231726326

例如,用IoC思想去反转UserServiceImpl的创建权,由原来程序中创建反转给通过BeanFactory去创建

image-20250724000713581

# 2、DI 依赖注入思想的提出

上面使用BeanFactory的方式已经实现的"控制反转",将Bean的创建权交给了BeanFactory,如果我们想将UserDao的创建权也反转给BeanFactory,与此同时UserService内部还需要用到UserDao实例对象,那应该怎样操作呢?

1)在程序中,通过BeanFactory获得UserService

2)在程序中,通过BeanFactory获得UserDao

3)在程序中,将UserDao设置给UserService

# 2.1、该方式是否存在一些问题?

UserService存在于BeanFactory中,UserDao也存在于BeanFactory中,可以在BeanFactory内部进行结合

image-20250724000751038

将UserDao在BeanFactory内部设置给UserService的过程叫做“注入”,而UserService需要依赖UserDao的注入才能正常工作,这个过程叫做

“依赖注入”

image-20250724000907458

# 2.2、面试题:IoC 和 DI 的关系?

首先,先回答IoC和DI的是什么:

IoC: Inversion of Control,控制反转,将Bean的创建权由原来程序反转给第三方

DI:Dependency Injection,依赖注入,某个Bean的完整创建依赖于其他Bean(或普通参数)的注入

其次,在回答IoC和DI的关系:

第一种观点:IoC强调的是Bean创建权的反转,而DI强调的是Bean的依赖关系,认为不是一回事

第二种观点:IoC强调的是Bean创建权的反转,而DI强调的是通过注入的方式反转Bean的创建权,认为DI是IoC的其中一种实现方式

# 3、AOP 面向切面思想的提出

IoC和DI思想主要是解决前面我们的困惑一,困惑二还没有解决

困惑一:层与层之间紧密耦合在了一起,接口与具体实现紧密耦合在了一起

解决思路:程序代码中不要手动new对象,第三方根据要求为程序提供需要的Bean对象

image-20250724001515240

困惑二:通用的事务功能耦合在业务代码中,通用的日志功能耦合在业务代码中

解决思路:程序代码中不要手动new对象,第三方根据要求为程序提供需要的Bean对象的代理对象,代理对象内部动态结合业务和通用功能

image-20250724001531235

困惑二的解决方案是,借助于IoC思想,将Bean的创建权反转给BeanFactory,而BeanFactory生产的Bean是目标Bean的代理对象,这样就可以在代理对象中对目标对象方法进行相应的增强。

image-20250724001637800

# 3.1、AOP简介

AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象都可以组成一个切面,而用这种思维去设计编程的方式叫做面向切面编程

image-20250724001736484

# 3.2、三种思想总结

1)IoC控制反转,是将程序创建Bean的权利反转给第三方;

2)DI依赖注入,某个完整Bean需要依赖于其他Bean(或属性)的注入;

3)AOP面向切面编程,用横向抽取方法(属性、对象等)思想,组装成一个功能性切面。

# 4、框架概念的出现

上面提出了一些思想来解决遇到的问题,而这些思想的实现就需要通过编码去落地,往往我们把具备一定业务领域解决方案的"工具"称为框架。

# 4.1、框架的基本特点:

  • 框架(Framework),是基于基础技术之上,从众多业务中抽取出的通用解决方案;

  • 框架是一个半成品,使用框架规定的语法开发可以提高开发效率,可以用简单的代码就能完成复杂的基础业务;

  • 框架内部使用大量的设计模式、算法、底层代码操作技术,如反射、内省、xml解析、注解解析等;

  • 框架一般都具备扩展性;

  • 有了框架,我们可以将精力尽可能的投入在纯业务开发上而不用去费心技术实现以及一些辅助业务。

# 4.2、Java中常用的框架:

不同语言,不同领域都有属于自己的框架,使用框架开发是作为程序员的最基础的底线。Java语言中的框架,可以分为基础框架和服务框架:

  • 基础框架:完成基本业务操作的框架,如MyBatis、Spring、SpringMVC、Struts2、Hibernate等

  • 服务框架:特定领域的框架,一般还可以对外提供服务框架,如MQ、ES、Nacos等

# 5、思想、框架和编码关系

image-20250724002044660

  • 架构师(高级程序员):把思想落地变为实现的人,例如上面的设计和BeanFactory的编写,即框架的设计和实现者。

  • 程序员:使用框架完成业务的人,其中UserServiceImpl、beans.xml、测试类都是我们编写的。

上次更新: 2025/07/25, 07:39:11
传统Javaweb开发的困惑
Spring框架的诞生

← 传统Javaweb开发的困惑 Spring框架的诞生→

Theme by Vdoing | Copyright © 2022-2025 Salmon's Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式