概述
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使用和核心
最后
以上就是落寞硬币为你收集整理的spring源码分析和IOC容器设计spring源码(一)的全部内容,希望文章能够帮你解决spring源码分析和IOC容器设计spring源码(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复