8-Spring循环依赖的处理逻辑
1. 目录[TOC] 2. 说明spring 解决循环依赖主要用到三层缓存,即singletonObjects、earlySingletonObjects、singletonFactories三个缓存,此三个缓存是三个Map作为DefaultSingletonBeanRegistry的成员属性 singletonObjects类型是ConcurrentHashMap earlySingletonObjects类型是ConcurrentHashMap singletonFactories类型是HashMap 3. 依赖分析 DefaultSingletonBeanRegistry...
7-Spring初始化单例Bean-createBean中的扩展接口
1. InstantiationAwareBeanPostProcessor1234567891011121314151617181920212223242526272829303132333435363738394041public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { @Nullable //在createBean() -> resolveBeforeInstantiation() 下调用, // 与resolveBeforeInstantiation配合所有postProcessBeforeInstantiation调用完成之后调用postProcessAfterInitialization default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException { return...
6-Spring初始化单例Bean-createBean
1. 目录[TOC] 2. 说明初始化bean的过程一般是放在getBean的匿名内部类创建中,一般不主动调起 3. 依赖分析DefaultListableBeanFactory的创建bean的方法主要依赖AbstractAutowireCapableBeanFactory, 4. 源码分析这里主要分析AbstractAutowireCapableBeanFactory 4.1. createBean()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960// AbstractAutowireCapableBeanFactory@Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException...
eureka服务搭建
EurekaServer搭建pom依赖123456789101112131415161718192021222324252627282930<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> ...
5-Spring 初始化单例Bean-getBean
1. 目录[TOC] 2. 说明前面ApplicationContex刷新流程中我们已经走到了beanFactory.preInstantiateSingletons(),初始化单例bean依赖于解析得到的BeanDefinition,且这是容器最后一步复杂的操作了 这里需要提一下,前面与Bean生命周期相关的BeanPostPocessor已经出初始化成了Bean,因为这涉及到全局的,因此提前初始化,这里需要初始化的都是一般的Bean了 3. 依赖关系DefaultlistableBeanFactory初始化单例主要逻辑是在AbstractBeanFactory中,其依赖关系如下图: AbstractBeanFactory在这里继承了DefalultSingletonBeanRegistry,DefalultSingletonBeanRegistry主要维护了单例bean的三级缓存逻辑 4. 源码解析4.1. DefaultListableBeanFactory#preInstantiateSingletons()...
4-Spring 注解扫描BeanDefinition
1. 目录[TOC] 2. 说明在基于xml的spring项目中,前面分析BeanDefinition加载中已经说到,解析代码中的注解@Component需要在配置文件中配置<context:component-scan/>,然后在解析标签时扫描包中的注解,并加入BeanDefinition中。 3. 依赖关系4. 源码解析源码解析从获取ContextNameSpaceHandler开始 4.1. ContextNameSpaceHandler 来源XmlReaderContext创建时会传入NamespaceHandlerResolver,NamespaceHandlerResolver便含有ContextNameSpaceHandler,代码如下 123456789public XmlReaderContext( Resource resource, ProblemReporter problemReporter, ReaderEventListener eventListener, SourceExtractor...
3-Spring BeanDefinition加载
1. 目录[TOC] 2. 说明3. 源码解析3.1. AbstractRefreshableApplicationContext#loadBeanDefinitionsAbstractRefreshableApplicationContext 不提供加载beanDefinition的具体逻辑,交由子类实现,xml加载的方式的子类为XmlWebApplicationContext, loadBeanDefinitions 加载Bean定义,此类在AbstractRefreshableApplicationContext为抽象方法,因此需要找到实现类方法XmlWebApplicationContext#loadBeanDefinitions() 实现类加载Bean定义 3.2. 加载入口方法1234567891011121314protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException { // 创建...
2-Spring ApplicationContext刷新流程
1. 目录[TOC] 2. 说明3. 依赖分析4. 源码解析4.1. AbstractApplicationContext#refresh()AbstractApplicationContext#refresh() 是spring容器重要的方法,此方法初始化了spring的上下文,加载了spring的容器。再其他地方需要重新刷新的时候也重建上下文。 上下文刷新,XmlWebApplicationContext继承至AbstractApplicationContext,直接调用的父类方法refresh()刷新方法真正初始化容器全流程 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667public void refresh() throws BeansException, IllegalStateException { //加锁 synchronized...
3 Mysql用户管理
1. 密码配置查看密码强度SHOW VARIABLES LIKE 'validate_password%'; 1.1. 临时修改密码强度(重启数据库后失效)12345SET GLOBAL validate_password.policy = LOW; -- 密码策略,默认值为MEDIUM。可以设置为LOW(只验证长度)、MEDIUM(验证长度、数字、大小写、特殊字符)、STRONG(验证长度、数字、大小写、特殊字符、字典文件)SET GLOBAL validate_password.length = 8; -- 密码最小长度,默认值为8SET GLOBAL validate_password.number_count = 1; -- 密码中的数字要求,默认值为1SET GLOBAL validate_password.special_char_count = 1;--密码中特殊字符的要求,默认值为1SET GLOBAL validate_password.mixed_case_count = 1; ...
1-Spring xml启动
1. 目录[TOC] 2. 说明梳理源码就从最原始的方式开始,使用xml加入tomcat是最直接引用spring的方式。之所以不用springboot,虽然它搭建简单,但springboot脚手架为我们做了很多事,引入spring的地方不直观,不利于分析源码。 首先配置web工程,web工程大家都知道是通过tomcat启动的,在web.xml配置参数,调用spring对应的类,这样spring就启动了 3. 依赖关系4. 源码解析4.1. tomcat的启动tomcat的启动流程咱就不分析了,这里主要从Tomcat提供的钩子函数开始。主要配置在web.xml中主要配置有: filter: 配置过滤器 listener:配置监听器,这也是spring启动最主要的钩子函数,必须继承javax.servlet.ServletContextListener servlet:...
