2月份流水账

最小化的spring学习 git地址https://github.com/DerekYRC/mini-spring

下面的词语全部复制此git,加一点点改动。

二:BeanDefinition和BeanDefinitionRegistry

  1. BeanDefinition,顾名思义,用于定义bean信息的类,包含bean的class类型、构造参数、属性值等信息,每个bean对应一个BeanDefinition的实例。简化BeanDefition仅包含bean的class类型。

  1. BeanDefinitionRegistry,BeanDefinition注册表接口,定义注册BeanDefintion的方法。

  1. SingletonBeanRegistry及其实现类DefaultSingletonBeanRegistry,获取单例bean的方法。

  1. 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上线遇到问题

主要还是准备不充分(代码不知道改动了什么)

  1. 定时任务~忘记打包,打包了一次还不对,忘还原

  1. 代码不严谨,非空校验太少(虽然说不是主要原因,但是有一定责任)。

  1. 思路要严谨,不要丢三落四!

  1. 涉及工单派发的一定要做规模评估

AopContext.currentProxy()方法可以获取到当前正在织入增强处理的代理对象,而直接调用则不会被增强处理。例如,在编写一个标注了@Transactional的方法时,若想取到在此方法上被织入的事务增强处理,可以使用AopContext.currentProxy()方法。

太忙了,先割了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值