最小化的spring学习 git地址https://github.com/DerekYRC/mini-spring
下面的词语全部复制此git,加一点点改动。
二:BeanDefinition和BeanDefinitionRegistry
BeanDefinition,顾名思义,用于定义bean信息的类,包含bean的class类型、构造参数、属性值等信息,每个bean对应一个BeanDefinition的实例。简化BeanDefition仅包含bean的class类型。
BeanDefinitionRegistry,BeanDefinition注册表接口,定义注册BeanDefintion的方法。
SingletonBeanRegistry及其实现类DefaultSingletonBeanRegistry,获取单例bean的方法。
DefaultListableBeanFactory作为BeanDefinitionRegistry和SingletonBeanRegistry的实现类(如下图所示),具备两者的能力。向bean容器中注册BeanDefintion不会实例化,只有使用bean时才会实例化。

三:Bean实例化策略InstantiationStrategy
当前版本bean是在AbstractAutowireCapableBeanFactory.doCreateBean方法中用beanClass.newInstance()来实例化,仅适用于bean有无参构造函数的情况。
针对bean的实例化,抽象出一个实例化策略的接口InstantiationStrategy,有两个实现类(如下图):
SimpleInstantiationStrategy,使用bean的构造函数来实例化
CglibSubclassingInstantiationStrategy,使用CGLIB动态生成子类

四:为bean填充属性
在BeanDefinition中增加和bean属性对应的PropertyVales,实例化bean之后,为bean填充属性(AbstractAutowireCapableBeanFactory#applyPropertyValues)。
五:为bean注入bean (对象a依赖对象b)
增加BeanReference类,包装一个bean对另一个bean的引用。实例化beanA后填充属性时,若PropertyValue#value为BeanReference,引用beanB,则先去实例化beanB。 由于不想增加代码的复杂度提高理解难度,暂时不支持循环依赖,后面会在高级篇中解决该问题。
六:资源和资源加载器(准备工具类)
Resource是资源的抽象和访问接口,简单写了三个实现类(如图)
FileSystemResource,文件系统资源的实现类
ClassPathResource,classpath下资源的实现类
UrlResource,对网络进行资源定位的实现类

ResourceLoader接口则是资源查找定位策略的抽象,DefaultResourceLoader是其默认实现类

文件转流 妙啊

七:在xml文件中定义bean(构建环境xml)
I/O模型:BIO、NIO、AIO(同步并阻塞,同步非阻塞,异步非阻塞)参考https://blog.csdn.net/qq_40378034/article/details/119710529
xml格式配置文件中声明式地定义bean的信息,源加载器读取xml文件,解析出bean的信息,然后往容器中注册BeanDefinition
BeanDefinitionReader是读取bean定义信息的抽象接口,XmlBeanDefinitionReader是从xml文件中读取的实现类。BeanDefinitionReader需要有获取资源的能力,且读取bean定义信息后需要往容器中注册BeanDefinition,因此BeanDefinitionReader的抽象实现类AbstractBeanDefinitionReader拥有ResourceLoader和BeanDefinitionRegistry两个属性。
由于从xml文件中读取的内容是String类型,所以属性仅支持String类型和引用其他Bean。

八:BeanFactoryPostProcess和BeanPostProcessor(傻傻分不清楚,spring框架中具有重量级地位的两个接口)
相同点:BeanFactoryPostProcess 和BeanPostProcessor都是spring提供的容器扩展机制
不同点:BeanFactoryPostProcess在bean实例化之前修改bean的定义信息即BeanDefinition的信息,
BeanPostProcessor在bean实例化后修改bean或替换bean(实现AOP的关键)
BeanFactoryPostProcess
方法如下:

BeanPostProcessor
方法如下:

九:应用上下文ApplicationContext
应用上下文ApplicationContext是spring中较之于BeanFactory更为先进的IOC容器,ApplicationContext除了拥有BeanFactory的所有功能外,还支持特殊类型bean如上一节中的BeanFactoryPostProcessor和BeanPostProcessor的自动识别、资源加载、容器事件和监听器、国际化支持、单例bean自动初始化等。
BeanFactory是spring的基础设施,面向spring本身;而ApplicationContext面向spring的使用者,应用场合使用ApplicationContext。
有了ApplicationContext,BeanFactoryPostProcessor和BeanPostProcessor就可以自动识别。
从bean的角度看,目前生命周期如下:

isAssignableFrom方法
如果是A.isAssignableFrom(B) 确定一个类(B)是不是继承来自于另一个父类(A),一个接口(A)是不是实现了另外一个接口(B),或者两个类相同。主要,这里比较的维度不是实例对象,而是类本身,因为这个方法本身就是Class类的方法,判断的肯定是和类信息相关的。
也就是判断当前的Class对象所表示的类,是不是参数中传递的Class对象所表示的类的父类,超接口,或者是相同的类型。是则返回true,否则返回false。
十:bean的初始化和销毁方法
在spring中,定义bean的初始化和销毁方法有三种方法:
在xml文件中制定init-method和destroy-method
继承自InitializingBean和DisposableBean
在方法上加注解PostConstruct和PreDestroy(这些都是java的注解)
到此为止,bean的生命周期如下:

RunTime.getRunTime().addShutdownHook() 在销毁时会调用(JVM销毁前执行的一个线程)
参考https://blog.csdn.net/weixin_39098944/article/details/108458891
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
System.out.println("thread1");
});
Thread thread2 = new Thread(() -> {
System.out.println("thread2");
});
Thread thread3 = new Thread(() -> {
System.out.println("销毁线程");
});
Runtime.getRuntime().addShutdownHook(thread3);
thread1.start();
thread2.start();
}
//输出结果
/**
thread1
thread2
销毁线程
*/
nacos AbstractLoadBalancerRule通过重写负载规则实现本地服务先运行。
mysql8 好像不需要加 useSSL=false
mysql5.7 一定要加useSSL=false
jenkins 打的nginx包访问403,原因是docker复制文件的时候,会复制文件权限。他原本没有可读权限,打的包也就没有可读权限。
OHC Java堆外缓存
https://tool.4xseo.com/article/218161.html
https://juejin.cn/post/7196868559125086264
2.17上线遇到问题
主要还是准备不充分(代码不知道改动了什么)
定时任务~忘记打包,打包了一次还不对,忘还原
代码不严谨,非空校验太少(虽然说不是主要原因,但是有一定责任)。
思路要严谨,不要丢三落四!
涉及工单派发的一定要做规模评估
AopContext.currentProxy()方法可以获取到当前正在织入增强处理的代理对象,而直接调用则不会被增强处理。例如,在编写一个标注了@Transactional的方法时,若想取到在此方法上被织入的事务增强处理,可以使用AopContext.currentProxy()方法。
太忙了,先割了