Spring(一)- IOC、DI、AOP思想概述

一、传统Javaweb开发的困惑

1. 传统Javaweb开发代码分析-用户模块

困惑一:层与层之间、接口与具体实现之间紧密耦合

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

2. 传统Javaweb开发困惑及解决方案

困惑一:层与层之间、接口与具体实现之间紧密耦合
解决思路:程序代码中不要手动new对象,第三方根据要求为程序提供需要的Bean对象

在这里插入图片描述

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

在这里插入图片描述

二、IoC、DI和AOP思想提出

在这里插入图片描述

1. IoC 控制反转思想的提出

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

在这里插入图片描述

IoC思想: Inversion of Control,翻译为“控制反转”或“反转控制”,强调的是原来在程序中创建Bean的权利反转给第三方。
例如:原来在程序中手动的去 new UserServiceImpl(),手动的去new UserDaoImpl(),而根据IoC思想的指导,寻求一个第三方去创建UserServiceImpl对象和UserDaoImpl对象。这样程序与具体对象就失去的直接联系。

谁去充当第三方角色呢?
工厂设计模式,BeanFactory来充当第三方的角色,来产生Bean实例
BeanFactory怎么知道产生哪些Bean实例呢?
可以使用配置文件去配置Bean的基本信息,BeanFactory根据配置文件来生产Bean实例

在这里插入图片描述

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

在这里插入图片描述

2. DI 依赖注入思想的提出

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

在这里插入图片描述

在这里插入图片描述

面试题: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思想主要是解决前面我们的困惑一,困惑二还没有解决
困惑一:层与层之间、接口与具体实现之间紧密耦合
困惑二:通用的事务、日志等功能耦合在业务代码中

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

在这里插入图片描述

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

在这里插入图片描述

4. 三种思想总结

1)IoC控制反转,是将程序创建Bean的权利反转给第三方;
2)DI依赖注入,某个完整Bean需要依赖于其他Bean(或属性)的注入;
3)AOP面向切面编程,用横向抽取方法(属性、对象等)思想,组装成一个功能性切面。

三、框架概念的出现

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

1. 框架的基本特点

⚫框架(Framework),是基于基础技术之上,从众多业务中抽取出的通用解决方案;
⚫ 框架是一个半成品,使用框架规定的语法开发可以提高开发效率,可以用简单的代码就能完成复杂的基础业务;
⚫ 框架内部使用大量的设计模式、算法、底层代码操作技术,如反射、内省、xml解析、注解解析等;
⚫ 框架一般都具备扩展性;
⚫ 有了框架,我们可以将精力尽可能的投入在纯业务开发上而不用去费心技术实现以及一些辅助业务。

2. Java中常用的框架

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

  • 基础框架:完成基本业务操作的框架,如MyBatis、Spring、SpringMVC、Struts2、Hibernate等
  • 服务框架:特定领域的框架,一般还可以对外提供服务框架,如MQ、ES、Nacos等

3. 思想、框架和编码关系

在这里插入图片描述

  • 架构师(高级程序员):把思想落地变为实现的人,例如上面的设计和BeanFactory的编写,即框架的设计和实现者。
  • 程序员:使用框架完成业务的人,其中UserServiceImpl、beans.xml、测试类都是程序员编写的。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值