spring源码分析和IOC容器设计

本文深入探讨Spring的核心特性,包括IOC(控制反转)和AOP(面向切面编程)。讲解了IOC如何通过依赖注入解耦代码,以及单例与原型bean的配置。同时,介绍了AOP在声明式事务管理中的应用,阐述了如何通过动态代理实现事务控制。文章还提及了Spring中对象实例化的方式,如反射、工厂模式,并提供了代码示例。
摘要由CSDN通过智能技术生成

spring源码(一)

spring全家桶

脚手架 springboot
微服务springcloud 等等

spring优势:

1、源码设计优雅,设计模式的优秀实践者。
2、对大量第三方框架的优秀集成支持和整合。
3、模块化思想。

读源码讲究:原则,方法

1、定焦原则。抓主线,主线外的逻辑不过多关注。
2、宏观原则。关注结构和流程,不过多关注细节,淡化具体代码。
3、善用debug断点调试工具,观察调用栈,关注触发逻辑
4、善用工具查看代码的上级调用方,如idea的 find usage功能
5、经验:观察代码命名规律,见名知意。
6、研究必须使用源代码,反编译存在失真。

核心思想:IOC和AOP

所有思想的核心围绕解耦展开,使代码易于扩展和维护。扩展>修改

1) IOC思想

1、IOC:控制对象的实例化。所谓控制反转就是执行代码将对象的实例化过程交给了springIOC容器去操作。负责对象创建和管理的。解决了程序解耦,面向接口编程。
2、new 对象的方式实例化会造成service层的实现类和dao层的实现类紧密耦合,当需要切换dao层实现类的时候必须改service代码。既不符合面向接口开发的最优原则。

2) IOC和DI(依赖注入)的区别

描述的是同一件事(对象实例化及依赖关系维护),角度不一样。IOC是站在对象的角度,DI是站在容器的角度(动作)通过容器把依赖的对象送过去。

1、实现方式:
(1)可以用反射实例化。class.forName("权限定类名")
(2)通过工厂反射实例化,全限定名配置化
2、工厂模式:
饿汉式:在对象使用之前已经实例化
懒汉式:在使用时再去实例化由@Lazy注解控制,例如:
//懒汉式实例化
@Bean
@Lazy
public User user() {
    return new User();
}

3、默认情况下,springIOC都是单例的!如果在配置对象的方法之前,补充添加@Scope注解,且注解参数配置为prototype时,就不是单例的了!例如:

@Bean
@Scope("prototype")
public User user() {
    return new User();
}

4、对象传值两个方式:
构造函数;
set方法传值

AOP:声明式事务

springAOP核心是通过动态代理方式,由动态代理对象在实际业务逻辑前或后执行一段需要插入的逻辑。实际上jvm执行的是动态代理对象。

1、事务控制:
service事务控制
  • 数据库事务归根结底是connection的事务,connection是连接对象、commit()提交事务、rolback()回滚事务
    connetction默认自动提交事务;setAutoCommit可以设置是否自动提交
2 控制思路:
 让connection和线程绑定,同一个线程都使用同一个connection,设置connetcion不自动提交。方法执行结束后统一commit提交。主要还是利用了数据的支持。如果数据库不支持,这个方法行不通。
3、实现

使用动态代理在目标方法执行前,获取当前线程的connectiond对象开启事务手动提交,方法执行抛出异常则roback回滚,方法正常执行结束后在代理对象中操作提交

  • 使用 jdk 动态代理(被代理对象必须实现接口,参数需要)
Object proxy = Proxy.newProxyInstance(被代理对象接口class.getClassLoader(),
被代理对象接口class.getInterface(),
// 匿名内部类 描述增强的逻辑是什么
new InvocationHandler(){
@Override
public Object invoke(
//代理对象本身
Object porxy,
//所调用的代理对象中的方法
Method method,
Object[] args
)
})
  • cglib动态代理 (被代理对象可以没有接口)
Enhancer.create(接口名,new MethodInterceptor()){
@Override
   public Object intercept(Object o,Method method,Object[]  objects,MethodProxy methodProxy)throws Throwable{
   method.invoke(接口名,objects);
}
}

下一章 springAOP使用和核心

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值