Spring5 源码学习 (4) refresh 方法 中讲到了refresh()方法中的invokeBeanFactoryPostProcessors(beanFactory)方法主要在执行BeanFactoryPostProcessor registryId); processConfigBeanDefinitions(registry); } 主要的逻辑在processConfigBeanDefinitions(registry);中,点开源码 candidateNames 前5个是Spring注册的内置processor,最后一个是传入给AnnotationConfigApplicationContext的配置类AppConfig.class 源码学习笔记:https://github.com/shenjianeng/spring-code-study
接上回 一步一步构建Spring5源码 构建完spring源码之后,让我们一起来探究源码。 AnnotationConfigApplicationContext 点开AnnotationConfigApplicationContext(AppConfig.class);方法查看源码: public 先说scanner的作用,通过查看源码可以发现,这个scanner只有在手动调用AnnotationConfigApplicationContext的一些方法的时候才会被使用(通过后面的源码探究也可以发现 点开源码: public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) ((AnnotationConfigApplicationContext) registry).beanFactory.beanDefinitionMap.png ---- 源码学习笔记:https:/
接上回 Spring5源码学习(1)已经讲完了this()方法,现在来看register(annotatedClasses);方法。 // new AnnotationConfigApplicationContext(AppConfig.class); 源码 public AnnotationConfigApplicationContext //org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition方法源码 public this.beanFactory.beanDefinitionMap ---- 源码学习笔记GITHUB仓库地址:https://github.com/shenjianeng/spring-code-study
Spring源码学习笔记(5)——@Conditonal注解 一. 源码如下: @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) public @interface extends Condition>[] value(); } Condition接口只有一个方法,判断是否满足当前条件,源码如下: public interface Condition { /* 源码分析 在Condition接口的matches()方法加断点,可以追溯到ConfigurationClassBeanDefinitionReader类的loadBeanDefinitionsForBeanMethod 源码如下: @Target({ ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented
关于postProcessBeanDefinitionRegistry方法的解析可以参看:Spring5 源码学习 (5) ConfigurationClassPostProcessor (上)。 现在我们来看一下ConfigurationClassPostProcessor#postProcessBeanFactory方法的源码。 源码解析 //ConfigurationClassPostProcessor#postProcessBeanFactory源码 public void postProcessBeanFactory(ConfigurableListableBeanFactory 主要来看一下对配置类进行增强方法enhanceConfigurationClasses(beanFactory);的源码。 设置增强Callback 下面,我们就以AppConfig为例,来学习增强Callback相关源码。
接上回 Spring5源码学习(2) ,分析完register(annotatedClasses);后,现在来看一下refresh();方法。 // new AnnotationConfigApplicationContext(AppConfig.class); 源码 public AnnotationConfigApplicationContext ApplicationListenerDetector //2.忽略部分类型的自动装配 //3.注册特殊的依赖类型,并使用相应的autowired值 //4.注册默认的environment beans //5. GenericApplicationContext的refreshBeanFactory()源码如下: //GenericApplicationContext#refreshBeanFactory 源码 源码学习笔记:https://github.com/shenjianeng/spring-code-study
接上文 Spring5源码分析(三)refresh方法 中已经讲到了refresh()中的postProcessBeanFactory(beanFactory);方法。 ---- invokeBeanFactoryPostProcessors(beanFactory); invokeBeanFactoryPostProcessors(beanFactory);方法源码如下 beanFactory.clearMetadataCache(); } 源码超级长,我们慢慢来看。 : //org.springframework.context.event.EventListenerMethodProcessor#postProcessBeanFactory 源码 @Override 源码学习笔记:https://github.com/shenjianeng/spring-code-study
AbstractBeanFactory#doGetBean AbstractBeanFactory#doGetBean源码如下: protected <T> T doGetBean(final String BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); } } return (T) bean; } 主要流程都已经在上述的源码中增加了注释 getSingleton(String beanName) { return getSingleton(beanName, true); } //getSingleton(beanName, true);源码 @DependsOn 通过源码可以知道,Spring 在创建 Bean 之前,首先会创建当前 Bean 所有依赖的 Bean。 未完待续... ---- 源码注释 GITHUB 地址:https://github.com/shenjianeng/spring-code-study
废话不多说,直接上源码注释: //AbstractApplicationContext#refresh源码 public void refresh() throws BeansException, IllegalStateException ApplicationListenerDetector //2.忽略部分类型的自动装配 //3.注册特殊的依赖类型,并使用相应的autowired值 //4.注册默认的environment beans //5. BeanPostProcessor,该方法的具体逻辑委托给了PostProcessorRegistrationDelegate#registerBeanPostProcessors方法,我们直接来看该方法源码 registerListeners 注册ApplicationListener,源码如下: protected void registerListeners() { // Register statically DefaultListableBeanFactory#preInstantiateSingletons: //DefaultListableBeanFactory#preInstantiateSingletons源码
前面提到了 Postgres 中的数据文件是被换分为了多个 page,每个 page 的大小默认是 8 KB。当我们向表中插入数据的时候,就需要从这些 page 中找到一个能够放得下这条数据的 page。
该方法就是在负责解析配置类、扫描包、注册BeanDefinition,源码如下: //ConfigurationClassParser#parseSet<BeanDefinitionHolder>) 方法源码 this.environment, this.resourceLoader); // @ComponentScan 中可以注册自定义的 BeanNameGenerator // 但是需要注意,通过源码可以明白 通过源码可以了解到,在@ComponentScan中是可以注册自定义的 BeanNameGenerator的,而这个BeanNameGenerator只对当前scanner有效。 // ConfigurationClassParser#processImports 源码 private void processImports(ConfigurationClass configClass = null); ---- 源码学习笔记:https://github.com/shenjianeng/spring-code-study
http://download.csdn.net/source/1690987
aop是面向切面编程,相比传统oop,aop能够在方法的前置,中置,后置中插入逻辑代码,对于项目中大量逻辑重复的代码,使用aop能很好的收口逻辑,将逻辑独立于业务代码之外,一处编写,多处使用。
; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Tool { /** * 该方法将指定的字符串用MD5算法加密后返回。 * @param s * @return */ public static String getMD5Encoding(String s) { byte[] input=s.getBytes(); ’,’d’,’e’,’f’}; try{ // 获得一个MD5摘要算法的对象 MessageDigest md=MessageDigest.getInstance(“MD5”); md.update (input); /* MD5算法的结果是128位一个整数,在这里javaAPI已经把结果转换成字节数组了 */ byte[] tmp = md.digest();//获得MD5的摘要结果 char[]
Django源码学习-5-Manager 模型自定义-上 ? Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
2020.2.1 + OpenJDK8U-jdk_x64_windows_hotspot_8u265b01 + gradle-6.5.1-bin.zip 遵循官方指导文档 ---- git clone 源码 源码地址: https://github.com/spring-projects/spring-framework ? 选择你拉取的spring源码,方式选择build.gradle ? 等待index完成,需要下载jar包 ,不是很快(我用了好几次,耗时好几个小时),如果期间出错,多试几次。 ? 至此,spring5.1.x的源码编译导入idea就算完成了。
源码下载 git地址: 进入https://github.com/spring-projects/spring-framework Spring的源码是发布在github上面的 ? ? 构建工作准备 安装源码有两种方式: 第一种: 下载spring使用的对应的Gradle版本,安装 第二种: 使用自带的gradleWrapper. 查看spring源码中gradle的版本. 下载对应版本的gradle. 在gradle-wrapper.properties中查看版本号 ? 编译Spring源码项目 1. 编译compileTestJava模块 进入到源码所在文件夹, 执行一下命令. 我的是mac本, 所以需要加./, 如果是windows本就不需要加 .
Django源码学习-4-Signals 信号量 Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form
spring源码分析5 强烈推介IDEA2020.2破解激活,IntelliJ 原文链接:https://gper.club/articles/7e7e7f7ff3g5bgc0
3.4> 任务添加到队列的代码逻辑 源码部分如下所示: 【解释】 通过isRunning方法来判断线程池状态是不是运行中状态,如果是,则将command任务放到阻塞队列workQueue中。 并不执行任务(因为,任务已经在上面的offer方法中被添加到了workQueue中了,等待线程池中的线程去消费队列中的任务) ---- 3.5> 线程池中的线程数量小于最大线程数代码逻辑以及拒绝策略的代码逻辑 源码部分如下所示 ---- 四、 源码解析——addWorker(Runnable firstTask, boolean core) 看完execute方法的源码解析,我们发现,代码里的逻辑判断就是我们在【1.2> 线程池工作流程 与它相似用法在ConcurrentHashMap中也出现过,如下所示: ---- 4.3> addWorkder的Part1解析 我们先看一下Part1的源码和注释: 在Part1中,首先还是从类型为 ---- 后面的内容,参见:源码解析:ThreadPoolExecutor(6)