
spring
进步一点点
w-小菜
I thank you from the bottom of my heart.
展开
-
mybatis源码---SqlSession构建
构建SqlSession工厂,看一下它的接口://构建SqlSession的工厂.工厂模式,8个方法可以用来创建SqlSession实例public interface SqlSessionFactory { SqlSession openSession(); //自动提交 SqlSession openSession(boolean autoCommit); //连接 SqlSession openSession(Connection connection); //事务隔离原创 2020-06-17 14:31:21 · 192 阅读 · 0 评论 -
mybatis源码---初始化configuration
我们的调试环境:调试代码:public class MyaaTest { public static void main(String[]args) { String resource = "config.xml"; try { //1.读取配置文件 InputStream in= Resources.getResourceAsStream(resource); SqlSessionFa原创 2020-06-17 13:32:17 · 210 阅读 · 0 评论 -
spring手写---AOP实现
《spring5核心原理》笔记思路:1.getBean的时候,读取我们的拦截表达式,该bean是否需要拦截,如果不需要拦截,就和之前IOC+DI模式一样,2.如果需要拦截,那么就需要调用方法,读取拦截信息,生成AopConfig类3.在拦截的bean里面,遍历该bean的方法,判断哪些方法需要拦截4.找到需要拦截的方法,读取我们配置信息中,需要添加的内容(前置,后置,异常等等通知),5.将我们准备好的通知LogAspect加载出来,根据需求,形成拦截连挂靠到方法中(意味着一个被拦截的原创 2020-06-15 13:06:55 · 229 阅读 · 0 评论 -
spring手写---MVC实现
思路:1.遍历实例化bean,找到带有@controller 标签的类,2.解析该类,把@RequestMapping和方法,类名形参映射,封装到Mapping中。3.接收请求,解析发送过来的request,拿到url,映射到具体的方法4.拿到请求过来的参数,然后利用反射,调用method,执行获得结果5.根据不同的返回结果进行返回,可能返回json,可能返回html。6.增加一个静态页面渲染的功能。(未产生效果,正则表达式可能有问题)1.XDispatcherServlet类原创 2020-06-15 12:44:16 · 188 阅读 · 0 评论 -
spring手写---DI实现
参考:《Spring 5核心原理》 我们这里实现Spring中DI,自动注入的功能,主要涉及class遍历,加载,解析,然后存入三个容器中,实例化几个过程。核心的内容就是:反射。整体结构: 一,注解设计1.@XService@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface XService { String value() def...原创 2020-06-13 11:31:50 · 259 阅读 · 0 评论 -
spring源码---Aop:代理创建
回到wrapIfNecessary()方法中,AbstractAutoProxyCreator类中,现在找到了匹配的Advisor类,开始为bean创建代理:protected Object createProxy(Class<?> beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) { //1.创建proxyFa原创 2020-08-16 23:11:40 · 233 阅读 · 0 评论 -
spring源码---Aop:匹配Bean
一,引入还记得在我们的aop配置中,加入了一个注解:@EnableAspectJAutoProxy,源码:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(AspectJAutoProxyRegistrar.class)public @interface EnableAspectJAutoProxy { boolean proxyTargetClass() default fa..原创 2020-08-13 21:21:31 · 345 阅读 · 0 评论 -
spring源码---Aop:解析@Aspect(二)
接着上一节分析,我们知道@Aspect的解析,发生在BeanFactoryAspectJAdvisorsBuilder类中,那么这个类是何方神圣呢?它在注解中写道:帮助@Aspecj bean from BeanFactory 进行解析,并且建立Advisors。用来auto -proxying。1.初始化:在AbstractAutoProxyCreator在refresh()第六步中进行getBean(),注入到BeanPostProcessor容器中的时候,进行了实例化and初始化,而它的子原创 2020-08-16 17:29:01 · 596 阅读 · 0 评论 -
spring源码---Aop:解析@Aspect(一)
aop启动,自然通知类,必不可少,那么spring是如何解析通知类的呢,目前我们从annotation启动过程中,发现spring只是把我们注册到配置类的@Aspect通知类作为一个普通的bean,实例化保存了起来,但是它的内容并没有发挥作用,或者说,当初始化@Aspect通知类的时候,按照我们配置在MyConfig配置类的顺序,前面的普通bean已经实例化,初始化完毕了,他们是如何通过@Aspect通知类进行自动代理的呢? 本节内容就是找到解析@Aspect的方式。 我们通过@Enable...原创 2020-08-16 12:45:21 · 707 阅读 · 0 评论 -
spring源码---Aop:调用过程
Spring Aop 是由接入BeanPostProcessor后置处理器开始的,Bean后置处理器是一个监听器,可以监听容器触发的Bean声明周期事件,向容器注册后置处理器以后,容器中管理的Bean就具备了接收IOC容器回调事件的能力。 BeanPostProcessor的调用发生在AbstractAutowireCapableBeanFactory类的doCreateBean()方法protected Object doCreateBean(final String beanName,...原创 2020-08-06 16:07:12 · 299 阅读 · 0 评论 -
spring源码---mvc:HandlerAdapter
一,HandlerAdapter接口public interface HandlerAdapter {//1.判断是否支持传入的handler boolean supports(Object handler); @Nullable //使用handler处理请求 ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;原创 2020-08-12 17:47:17 · 257 阅读 · 0 评论 -
spring源码---mvc:AbstractHandlerMethodMapping
他是使用也比较频繁,和@RequestMapping()对应,将一个method变成一个Handlermethod。1.字段:初看比较简单:private boolean detectHandlerMethodsInAncestorContexts = false;@Nullableprivate HandlerMethodMappingNamingStrategy<T> namingStrategy;private final MappingRegistry map...原创 2020-08-12 16:12:48 · 329 阅读 · 0 评论 -
spring源码---mvc:HandlerMapping
一.接口HandlerMappingpublic interface HandlerMapping { @Nullable HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;}只有一个方法getHandler(),根据request返回一个handlerExecutionChain执行链,该接口还有很多字段。二. AbstractHandlerMapping H...原创 2020-08-12 15:09:01 · 261 阅读 · 0 评论 -
spring源码---mvc:处理流程
请求处理流程:从jdk的HttpServlet到达DispatcherServlet类的doDIspatch()方法的过程如下:具体的代码可以参考:https://blog.youkuaiyun.com/zknxx/article/details/75194820现在我们从doDispatch()方法开始解析请求处理的过程:protected void doDispatch(HttpServletRequest request, HttpServletResponse response) thro原创 2020-08-12 11:04:41 · 205 阅读 · 0 评论 -
spring源码---mvc:九大组件
一,九大组件1.handlerMapping 用来查找handler的,也就是处理器,对应的就是标签@RequestMapping。也就是说handler,可以是类,也可以是方法.2.handlerAdapter 我们最原始的servlet处理方式可以知道,当一个请求到达的时候,是封装成request发送到servlet的doService(HttpServletRequest,HttpServletResponse)形式的,所以,要从传统的servlet模式转到spring m...原创 2020-08-12 09:37:50 · 373 阅读 · 0 评论 -
spring源码---mvc:初始化
一,九大组件1.handlerMapping 用来查找handler的,也就是处理器,对应的就是标签@RequestMapping。也就是说handler,可以是类,也可以是方法.2.handlerAdapter 我们最原始的servlet处理方式可以知道,当一个请求到达的时候,是封装成request发送到servlet的doService(HttpServletRequest,HttpServletResponse)形式的,所以,要从传统的servlet模式转到spring m...原创 2020-08-09 11:43:44 · 300 阅读 · 0 评论 -
spring源码---DI:populate()
------------------------------------- 2. 调用postProcess后置处理器 synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); mbd.postProcessed = true;} } 我们这里看最后一行...原创 2020-08-08 17:28:18 · 475 阅读 · 0 评论 -
spring源码---DI:实例化单例bean
接着上一节,如果在缓冲中找不到bean,那么要不就是循环依赖出问题了,要不就需要找到beanDefinitioin 进行实例化,我们这里来介绍后者。 1.获取beanDefinitioin。 2.创建bean(单例,原型,自定义) 3.对创建的bean实例对象进行类型检查正文: 第一个:获取beanDefinition//在本类的容器中,没有...原创 2020-04-01 20:15:57 · 315 阅读 · 0 评论 -
spring源码---DI:获得已存在bean
我们把bean注册进入了map容器中,也就是DefalutListableBeanFactory中,那么如何使用这些bean呢,什么时候会时候到这些bean呢? 1.当用户调用getBean(Object)方法的时候,容器会触发依赖注入。 2.容器在解析bean定义的时候,单列模式,饿汉式,那么ioc也会触发依赖注入,也就是实例化。 我们知道这些类的顶层都是beanFa...原创 2020-03-31 23:30:09 · 428 阅读 · 0 评论 -
spring源码---IOC:refresh()总结
三,prepareBeanFactory(beanFactory)BeanFactory的预准备工作(BeanFactory进行一些设置);prepareBeanFactory()代码内容很多,总结如下 1)、设置BeanFactory的类加载器、支持表达式解析器... 2)、添加部分BeanPostProcessor【ApplicationContextAwareProcessor】 3)、设置忽略的自动装配的接口EnvironmentAware、EmbeddedValueRes原创 2020-08-16 11:29:12 · 293 阅读 · 0 评论 -
spring源码---IOC:注册bean(注解方式)
接着上一节,我们已经把配置类中的所有信息都解析出来,放到了configClass中,现在我们调用loadBeanDefinition()方法,注解解析出来的bean。Set<ConfigurationClass> configClasses = new LinkedHashSet<>(parser.getConfigurationClasses());configClasses.removeAll(alreadyParsed); //删除已经解析的// Read the原创 2020-08-15 10:02:12 · 453 阅读 · 0 评论 -
spring源码---IOC:解析配置类(二)
跟着上一节,我们来到ConfigurationClassProcessor类中:一,ConfigurationClassProcessorpublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { int registryId = System.identityHashCode(registry); this.registriesPostProcessed.add(registryId原创 2020-08-14 20:20:39 · 332 阅读 · 0 评论 -
spring源码---IOC:解析配置类(一)
二,包扫描方式第二种方式 包扫描方式(第一种是直接给一个bean的class对象,通过扫描类进行注解。)现在是给出MainConfig类的包,该包下面可能有几个配置类,入口:构造方法。 public AnnotationConfigApplicationContext(String... basePackages) { this(); scan(basePackages); refresh(); } 包扫描方式,如果让我实现,无非就是在第一种方式的基础上,增加了自己找到bean.原创 2020-08-14 16:17:21 · 285 阅读 · 0 评论 -
spring源码---IOC:注解方式启动
说明:《spring 5 核心原理》读书笔记spring中注解的使用请参考:https://www.cnblogs.com/cxuanBlog/p/11179439.html Spring中管理注解 的bean定义的容器 有两个,一个是AnnotationConfigApplicationContext另外一个是AnnotationConfigWebApplicationContext...原创 2020-03-30 17:22:14 · 809 阅读 · 0 评论 -
spring源码---IOC:注册bean(xml方式)
接着上一节,讲到parseBeanDefinitions()方法,位于DefaultBeanDefinitionDocumentReader类中protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { if (delegate.isDefaultNamespace(root)) { NodeList nl = root.getChildNodes(); //获取原创 2020-08-07 21:57:56 · 323 阅读 · 0 评论 -
spring源码---IOC:解析xml
接着上一篇,写道refresh(),在这个方法里面有14个方法,加载流程,我们一个一个的进去看一看到底发生了什么。第一个方法:prepareRefresh();功能:调用容器准备刷新的方法,获取容器的当前时间,同时给容器设置同步表示。参考:https://www.cnblogs.com/feng-jq/p/10282179.htmlprotected void prepareRefresh() { //切换到活动状态。 this.startupDate = System.current原创 2020-06-15 20:26:24 · 317 阅读 · 0 评论 -
spring源码---IOC:xml式启动
spring的使用,有两种基本的方式,第一个是基于xml的,第二个是基于java配置类的,而这两者都可以通用的使用注解来开发,我们在使用spring 的过程中,spring到底是如何实现我们想要的功能的呢? 我们都知道:spring的几个核心功能:IOC DI AOP MVC 当然还有其他的功能,我们这里将要一步一步的刨昔,spring的后面,到底是如何实现这些功能的。 sprin...原创 2020-03-26 22:46:46 · 309 阅读 · 0 评论 -
spring源码---阅读环境搭建
目标:在本地能够运行demo,dubug调试源码准备内容:1.从github下载源码2.准备gradle3.Idea (注意这里的gradle和idea版本要匹配)一,开始,cmd进入到源码空间,使用gradle进行处理(下载依赖的jar包)输入命令:gradlew:spring-oxm:compileTestJavabuild成功,好的,我们导入idea中。这里直接然回,直接导入了欧克了导入进来 自动要编译我们使用maven 创建一个demo,.原创 2020-06-16 23:19:04 · 246 阅读 · 0 评论