spring源码解析

本文探讨了Spring框架中的IoC(控制反转)和AOP(面向切面编程)概念,如何通过IOC容器简化对象创建并降低耦合。AOP通过动态代理实现在核心业务中加入非核心共性逻辑。Spring底层实现涉及配置管理、Bean构建和依赖注入。
摘要由CSDN通过智能技术生成
  1. IOC
什么是IOC?

IOC - 控制翻转(思想),将创建对象的权利交给第三方(IOC容器 - BeanFactory)。

.2 为什么需要将创建对象的权利交给第三方?自己创建有什么问题吗?

解耦

解耦有什么好处?
在编程过程中,A类中直接new B类的对象,这种行为称之为硬编码耦合。硬编码耦合不会对业务造成任何影响,但是增加了A类和B类之间的关联程度(耦合性),假设在后续的维护过程中,因为系统的升级,需要改变B类的构造形式(比如构造方法发生了变化),这时除了要修改B类本身的代码之外,还要去调整A类的代码。如果还有很多类new了B类,那么也就意味着这些类都需要一一修改,极大的增加了程序的维护成本。IOC就是为了解除这种耦合性,所设计的思想。

Servlet{

private IService=new ServiceImpl();

}

假如Servlet是A类ServiceImpl是b类

A类和b类和ioc的容器的关系,就有点像注册中心和微服务的关系;现在全部的类都交给ioc容器管理,现在A类要调b类直接去ioc容器告诉我b类,直接去调就好了,假如b类的构造形式发生了变化和a类没有关系,唯一变化是ioc容器,至于是什么构造出来的也和a类也没有关系

  1. AOP
2.1 什么是AOP?

AOP - 面向切面编程(思想),在实际开发过程中,有很多业务需要处理,往往每个业务都可以拆分成核心业务非核心业务,每个业务的核心业务必然不同,但是非核心业务却往往有相同的部分(比如事务的开启与提交、日志的管理、程序的监控、资源的回收…),将非核心业务提取出现,形成一个个的切面,开发者在开发过程中只需要关注核心业务部分即可,程序在运行时,将非核心业务(切面)与开发者的核心业务代码重新组织在一起,形成完整的业务,这种针对一个个切面的编程方式就称之为面向切面编程。

2.2 AOP的核心实现

动态代理 - JDK动态代理、Cglib动态代理

动态代理和静态代理的区别?

静态代理需要自己新建代理类,创建代理对象,动态代理无需为每个类创建代理类,
而是自动的生成代理对象。

静态代理
在这里插入图片描述
动态代理
在这里插入图片描述

动态代理的使用场景:
​ 事务是用aop实现的,在controller层,调用业务层接口,实现类上有一个事务管理,调用者调用的就不是实现类了,而是事务管理之后的动态代理对象,我们打印出来发现是代理对象,但是当我把事务删掉之后发现打印出来的实现类,由此我们可以发现当把注入改成 private OrdersServiceImpl iOrdersService = new OrdersServiceImpl() ; 事务是不起作用的,得new一个代理对象。这就是ioc的好处他会把写了事务的方法自动生成代理对象,这就是构造形式发生了变化也就是ioc,也可以发现没有ioc,aop都变得不好用了。每一个aop都是一个独立的aop,如果还有别的aop,会调用前一个aop的代理对象,就是不调用实现类。
在这里插入图片描述
在这里插入图片描述

打印出来的结果:
在这里插入图片描述
删掉了事务注解:
在这里插入图片描述

Spring底层如何实现?(如果让你去实现Spring,该如何实现)

1)Spring如何知道该管理哪些Bean?- 通过各种配置

2)Spring的Bean是如何管理的(保存在什么地方)? - 通过Map管理的,内存中

3)Spring如何去构造一个Bean的(new一下)?- 反射构建,解决依赖注入(递归、反射)
在这里插入图片描述
xml肯定要dom解析,注解肯定要反射扫描,如果不处理bean的依赖注入private EventUtil eventUtil; 注入的接口都会为空,就算有注解也和他为空没有什么关系,@Autowired只是让spring管理而已。有没有可能去容器中找对应类型的bean对象找不到,假如xml有两个bean,a在前,b在后,按照配置来讲他会先解析a先通过反射的形式构造a类对象,然后通过@Autowired注入b类,这个时候b类在容器里面是没有的。这个时候我们就可以用递归的方式在去容器中获得对应类型的bean对象打断回到配置初始化b类就可以了。初始化好了就把他存到集合中,因为有一个方法getbean(),参数有两个,“controller”和xxx.class类型两种方法方式通过bean的名字和类型来获得bean的对象,很明显这是通过key找value,底层就是map集合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值