Spring技术内幕——读书笔记

spring技术内幕——深入解析spring架构与设计原理 林纳斯·托瓦兹(Linus Torvalds)说:“我从心底认为,优秀的程序员与平庸的程序员之间的区别,是在于认为自己的代码重要还是数据结构更加重要。平庸的程序员眼里只有代码,优秀的程序员则关注数据结构及之前的关系。” 1、spring的设计理念 spring提供了一个轻量级的开发框架,抽象了实际开发中的很多共性问题;在javaee的开发中,支持pojo和使用javabean的开发方式,使应用面向接口开发、充分支持OO; 通过spring的ioc容器,将复杂的对象耦合关系变成了一个文本化、外部化的工. 阅读详情

Spring技术内幕

第1章 Spring的设计理念和整体架构(略)

第2章 Spring Framework的核心:IoC容器的实现

两个主要容器:
  1. 实现BeanFactory接口的简单容器系列:实现容器的最基本功能
  2. ApplicationContext:增加了许多面向框架的特性,同时对应用环境作了许多适配

IoC容器的接口设计图:
这里写图片描述

BeanFactory

接口方法:
- containsBean
- isSingleton
- isPrototype
- isTypeMatch
- getType
- getAliases

设计原理:(以XmlBeanFactory为例)
编程式使用IoC容器:

ClassPathResource res = new ClassPathResource("bean.xml");
    DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
    reader.loadBeanDefinitions(res);

步骤:
1. 创建IoC配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息
2. 创建一个BeanFactory,这里使用DefaultListableBeanFactory
3. 创建一个载入BeanDefinition的读取器,通过一个回调配置给BeanFactory
4. 从定义好的资源位置读入配置信息,具体的解析过程由XmlBeanDefinitionReader来完成。

IoC容器的初始化过程

Resource定位过程:
这里写图片描述

BeanDefinition的载入和解析:
对IoC容器来说,这个载入过程,相当于把定义的BeanDefinition在IoC容器中转化为一个Spring内部表示的数据结构的过程,这些BeanDefinition数据在IoC容器中通过一个HashMap来保持和维护。

这里写图片描述

BeanDefinition在IoC容器中的注册:
在DefaultListableBeanFactory中实现了BeanDefinitionRegistry的接口,这个接口的实现完成BeanDefinition向容器的注册,就是把解析得到的BeanDefinition设置到hashMap中去。
这里写图片描述

IoC容器的依赖注入

什么时候注入:在用户第一次向IoC容器索要bean的时候(lazy-init预实例化除外)
这里写图片描述

两种实例化Java对象的方法:
- 通过BeanUtils,使用Java反射功能
- 通过CGLIB的Enhancer类的create方法

容器初始化和关闭过程

这里写图片描述

Bean的生命周期:
1. Bean实例的创建
2. 为Bean实例设置属性
3. 调用Bean的初始化方法
4. 应用可以通过IoC容器使用Bean
5. 当容器关闭时,调用Bean的销毁方法

lazy-init属性和预实例化:在refresh初始化容器的时候去getBean去触发依赖注入

FactoryBean的实现:类似于抽象工厂模式,封装Proxy、RMI、JNDI等

BeanPostProcessor的实现:
两个方法:postProcessBeforeInitialization/postProcessAfterInitialization

IoC容器对Bean的初始化
- 为类型是BeanNameAware的Bean设置Bean的名字
- 为类型是BeanClassLoaderAware的Bean设置类装载器
- 为类型是BeanFactoryAware的Bean设置自身所在的IoC容器以供回调使用
- 对postProcessBeforeInitialization/postProcessAfterInitialization的回调
- 初始化属性init-method的处理

autowiring(自动依赖装配)的实现

//开始进行依赖注入过程,先处理autowiring的注入
    if (mbd.getResolvedAutowiredMode() == RootBeanDefinition.AUTOWIRE_BY_NAME || mbd.getResolvedAutowiredMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
        MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
        //这里是对autowire注入的处理,根据Bean的名字或者type进行autowire的过程
        if (mbd.getResolvedAutowiredMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
            autowireByName(beanName, mbd, bw, newPvs);
        }
        if (mbd.getResolvedAutowiredMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
            autowireByType(beanName, mbd, bw, newPvs);
        }
        pvs = newPvs;
    }

第3章 Spring AOP的实现

Spring AOP概述

Advice通知:
- BeforeAdvice:接口MethodBeforeAdvice,方法before()
- AfterAdvice:接口AfterReturningAdvice,方法afterReturning()
- ThrowsAdvice:在抛出异常时回调,这个回调是AOP通过反射机制完成的。

Pointcut切点:
概念:决定Advice通知应该作用于哪个连接点。返回一个MethodMatcher,由它来判断是否需要对当前方法调用进行增强,或者是否需要对当前调用方法应用配置好的Advice通知。

  • 通过正则表达式进行匹配
  • 通过方法名进行匹配
  • 等等
Spring AOP的设计和实现

JVM动态代理
这里写图片描述

Advisor通知器:
概念:将Advice和pointcut结合起来,可以定义应该使用哪个通知在哪个关注点使用。

建立AopProxy代理对象

ProxyFactoryBean:封装了主要代理对象的生成过程,生成方式有两种
- JDK的Proxy
- CGLIB
这里写图片描述

JDK生成AopProxy代理对象

public Obejct getObject(ClassLoader classLoader) {
        if (logger.isDebugEnabled()) {
            logger.debug("Creating JDK dynamic proxy: target source is " + this.advised.getTargetSource());
        }
        Class[] proxiedInterfaces AopProxyUtils.completeProxiedInterfaces(this.advised);
        findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
        //这是调用JDK生成Proxy的地方
        return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
    }
拦截器调用的实现

JdkDynamicAopProxy的invoke拦截:
当Proxy对象的代理方法被调用的时候,JdkDynamicAopProxy的invoke方法作为Proxy对象的回调函数被触发,从而通过invoke的具体实现,构造ReflectiveMethodInvocation对象来完成对目标对象方法调用的拦截或者说功能增强。

Cglib2AopProxy的intercept拦截:
与JdkDynamicAopProxy的回调实现非常类似,唯一不同的是构造CglibMethodInvocation对象来完成拦截器链的调用。

对目标方法的调用:
- jdk:使用反射机制得到调用方法的反射对象,然后使用invoke启动对方法反射对象的调用。
- cglib:通过MethodProxy对象来直接invoke完成的

AOP拦截器链的调用:
1. 先进行判断,如果已经运行到拦截器链的末尾,直接调用目标对象的实现方法
2. 否则,沿着拦截器链继续进行,得到下一个拦截器,通过这个拦截器进行matches判断,是否适用于横切增强的场合,如果是,从拦截器中得到通知器,并启动通知器的invoke方法进行切面增强
3. 结束之后,迭代调用proceed方法,直到拦截器链中的拦截器都完成以上的拦截过程为止

配置通知器:
MethodBeforeAdviceAdapter的实现

 class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {

    @Override
    public boolean supportsAdvice(Advice advice) {
        return (advice instanceof MethodBeforeAdvice);
    }

    @Override
    public MethodInterceptor getInterceptor(Advisor advisor) {
        MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();
        return new MethodBeforeAdviceInterceptor(advice);
    }
}

MethodBeforeAdviceInterceptor的实现

    public class MethodBeforeAdviceInterceptor implements MethodInterceptor, Serializable {

    private MethodBeforeAdvice advice;


    //为指定的Advice创建对应的MethodBeforeAdviceInterceptor对象
    public MethodBeforeAdviceInterceptor(MethodBeforeAdvice advice) {
        Assert.notNull(advice, "Advice must not be null");
        this.advice = advice;
    }

//这个invoke方法是拦截器的回调方法,会在代理对象的方法被调用时触发回调
    @Override
    public Object invoke(MethodInvocation mi) throws Throwable {
        this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis() );
        return mi.proceed();
    }
}

AfterReturningAdviceInterceptor的实现

  public class AfterReturningAdviceInterceptor implements MethodInterceptor, AfterAdvice, Serializable {

    private final AfterReturningAdvice advice;


    /**
     * Create a new AfterReturningAdviceInterceptor for the given advice.
     * @param advice the AfterReturningAdvice to wrap
     */
    public AfterReturningAdviceInterceptor(AfterReturningAdvice advice) {
        Assert.notNull(advice, "Advice must not be null");
        this.advice = advice;
    }

    @Override
    public Object invoke(MethodInvocation mi) throws Throwable {
        Object retVal = mi.proceed();
        this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), mi.getThis());
        return retVal;
    }

}
Spring AOP的高级特性

HotSwappableTaregetSource:使用户可以以线程安全的方式切换目标对象,提供所谓的热交换功能。

  public synchronized Object swap(Object newTarget) throws IllegalArgumentException {
        Assert.notNull(newTarget, "Target object must not be null");
        Object old = this.target;
        this.target = newTarget;
        return old;
    }

public synchronized Object getTarget() {
        return this.target;
    }

第4章 Spring MVC与Web环境

Web环境中的Spring MVC:
SpringMVC是建立在IoC容器基础上的,该容器由web.xml里配置的ContextLoaderListener负责启动的。

上下文在Web容器的启动:
这里写图片描述

Spring MVC的设计和实现

DispatcherServlet的处理过程:
这里写图片描述

doDispatch协同模型和控制器的过程:
这里写图片描述

Handler的如何获得:
1. 首先会在HttpRequest中取得handler
2. 如果没有,则遍历当前DispatcherServlet持有的所有handlerMapping,返回需要的handler。

Spring MVC视图的呈现

DispathcherServlet的render:

    protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
    // Determine locale for request and apply it to the response.
    Locale locale = this.localeResolver.resolveLocale(request);
    response.setLocale(locale);

    View view;
    if (mv.isReference()) {
        // We need to resolve the view name.
        view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() +
                    "' in servlet with name '" + getServletName() + "'");
        }
    }
    else {
        // No need to lookup: the ModelAndView object contains the actual View object.
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                    "View object in servlet with name '" + getServletName() + "'");
        }
    }

    // Delegate to the View object for rendering.
    if (logger.isDebugEnabled()) {
        logger.debug("Rendering view [" + view + "] in DispatcherServlet with name '" + getServletName() + "'");
    }
    try {
        view.render(mv.getModelInternal(), request, response);
    }
    catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "] in DispatcherServlet with name '" +
                    getServletName() + "'", ex);
        }
        throw ex;
    }
}

第5章 数据库操作组件的实现

Spring JDBC

JdbcTemplate的execute实现:
这里写图片描述

JdbcTemplate的query实现:
这里写图片描述

Spring JDBC中RDBMS操作对象的实现

SqlQuery的实现:
这里写图片描述

SqlUpdate的实现:
这里写图片描述

SqlFunction:
这里写图片描述

Spring驱动Hibernate的设计和实现

基本配置Bean:
LocalSessionFactoryBean,生成SessionFactory,并对Hibernate中的Session进行管理
这里写图片描述

Session的管理:
Spring对Hibernate Session的管理功能都是由SessionFactoryUtils这个类来提供的。
1. 如果当前线程已绑定事务,Session使用的Connection是当前线程绑定的那个
2. 新建Session和单独使用SessionFactory打开新Session一样,都是使用SessionFactory的openSession来创建新的Session

Spring驱动iBatis的设计与实现

iBatis操作数据库的主要类:
SqlMapClient,类似于Hibernate的Session,是由SqlMapClientFactoryBean在依赖注入完成以后被IoC容器回调afterPropertiesSet中完成创建的。
这里写图片描述

第6章 Spring事务处理的实现

Spring声明式事务处理

这里写图片描述

Spring事务处理的设计与实现

事务的创建:
这里写图片描述

事务创建的结果是生成一个TransactionStatus对象,通过这个对象来保存事务处理需要的基本信息,这个是TransactionInfo的一个属性,然后会把TransactionInfo保存在ThreadLocal对象里,这样当前线程可以通过ThreadLocal对象取得TransactionInfo以及与这个事务对应的TransactionStatus对象,从而把处理信息和调用事务方法的当前线程绑定起来。

Spring事务处理

DataSourceTransactionManager的实现:
这里写图片描述

HibernateTransactionManager的实现:
这里写图片描述

第7章 Spring远端调用的实现

Spring HTTP调用器的实现

HTTP调用客户端的实现:
这里写图片描述

HTTP调用器客户端完成远端调用的基本过程:
首先由客户端应用调用代理方法,在调用发生以后,代理类会先运行拦截器,对代理的方法调用进行拦截。在拦截器的拦截行为中,先对本地发生的方法调用进行封装 ,具体来说,就是封装成MethodInvocation对象。然后,把这个MethodInvocation对象,通过序列化和HTTP请求发送到服务器端,在服务器端的处理完成以后,会通过HTTP响应返回处理结果,这个处理结果被风中在RemoteInvocationResult对象中。

HTTP调用服务端的实现:
这里写图片描述

Spring RMI的实现

Spring RMI客户端的实现:
这里写图片描述

第8章 安全框架ACEGI的设计与实现

概述

这里写图片描述

ACGEI验证器的实现

过程:
1. 从AuthenticationProcessingFilter拦截HTTP请求开始,接着会从HTTP请求中得到用户输入的用户名和密码,并将这些输入的用户信息放到Authentication对象中。
2. 将这个Authentication对象传递给AuthenticationManager使用,验证器通过持有的Authentication对象把它和服务端取得的用户信息进行对比,从而完成用户验证。
3. 验证完成以后,ACEGI会把通过验证的、有效的用户信息封装在一个Authentication对象中,供以后的授权器使用

在验证的实现过程中,需要根据ACEGI的要求,配置好各种Provider、UserDetailService以及密码Encoder对象,通过这些对象的协作和功能实现,完成服务器用户数据的获取与用户输入信息的对比和最终的用户验证工作。

ACEGI授权器的实现

过程:
1. 从FilterSecurityInterceptor拦截HTTP入手,接着在读取在IoC容器中配置的对URL资源的安全需求以后,会把这些配置信息交由AccessDecisionManager授权器进行授权决策
2. 配置好授权器以后,还需要配置一些投票器来完成投票工作,支持授权的决策过程,具体对资源的安全请求进行一个判断
3. 授权器根据授权规则对投票器提交的投票结果进行汇总判断,得到最后的决策结果,从而完成最终的授权工作,最终决定该用户对HTTP请求所要求的URL资源是否有权限获取

第9章 Spring DM模块的设计与实现 略

第10章 Spring Flex的设计与实现 略

Tecplot进阶:巧用公式与多Frame对比,实现CFD多工况数据差异的可视化分析 本文详细介绍了如何利用Tecplot进行CFD多工况数据差异的可视化分析,通过公式计算和多Frame对比,实现变量差值自动计算、多视图同步展示和差异量化统计。文章还提供了数据准备、基础操作、实战技巧和常见问题解决方案,帮助工程师高效完成CFD后处理工作。 阅读详情

相关推荐

DC-DC拓扑:从电感位置一眼识别Buck、Boost与Buck-Boost

本文详细解析了DC-DC拓扑中电感位置对识别Buck、Boost与Buck-Boost电路的关键作用。通过对比不同拓扑的电感连接特征,提供快速识别方法和设计要点,帮助工程师避免常见错误并优化电路性能。特别强调电感位置对输出质量和效率的影响,适合电源设计人员参考。

java2000.net 372

spring技术内幕

Spring核心的模式实现,是为应用提供IoC容器和AOP框架。在spring中,Java EE的服务都被抽象到IoC容器中,并通过AOP进行有效的封装,因为依赖注入 的特性,这些复杂的依赖关系的管理被反转并交给容器,使复杂的依赖关系的管理从应用中解放出来。依赖反转:哪些方面的控制被反转了? 依赖的对象的获得被反转了。控制反转一个更好听的名字:依赖注入。 如何反转对依赖的控制:把控制权从具体的业

超帅哥哥的人生巅峰 870

Android车载桌面开发实战:从CarLauncher源码解析到自定义Launcher开发(Android 11)

本文深入解析了Android 11中CarLauncher的源码架构与核心模块,并提供了从零开始定制开发车载Launcher的完整实战指南。内容涵盖车载桌面的独特定位、驾驶场景优化、多屏协同、动态内容嵌入等核心挑战,以及如何构建符合安全规范、体验流畅的自定义车载桌面应用,是车载应用开发者提升系统级定制能力的实用参考。

weixin_29266647的博客 516

京东大牛整理出了这份《Spring技术内幕》,深入解析Spring原理

在Java企业应用中,与我们熟悉的企业应用服务器一样, Spring也希望能够集成管理企业应用资源,以及为应用开发提供平台支持。在这一点 上,Spring 与UNIX和Windows等传统意义上的操作系统,在计算系统中起到的作用是类似的。不同点在于,传统操作系统关心的是存储、计算、通信、外围设备等这些物理资源的管理,并在管理这些资源的基础上,为应用程序提供统--的平台和服务接口;

m0_73311735的博客 298

RTX 50系显卡(5080/5090D)CUDA 12.8环境下的vLLM部署避坑与实战指南

本文为RTX 5080/5090D显卡用户提供了在CUDA 12.8环境下部署vLLM的完整实战指南。文章详细介绍了从驱动安装、CUDA 12.8环境配置、PyTorch Nightly版本精准匹配,到vLLM源码编译及常见报错排查的全过程,帮助开发者高效利用新一代硬件进行大模型推理。

gray5的博客 671

【C++】小猫钓鱼纸牌游戏--C++实现

小猫钓鱼问题: 描述:初始,两个人各有n张牌(牌面0-10),顺序固定,只能按顺序出牌。然后,两个人轮流在桌面上以接龙的方式出牌,当某个人放置的牌在桌面上已经出现时,他收起相同牌面及其中间的牌作为自己的筹码,同时需要再放一张牌到桌面。某人手上的牌出完后,另一个人继续出,直到两人手上都没牌为止,输出结束时两个人手上的筹码数。 #include<iostream> using namespace std; struct queue { int head; //队列首 int tail; //

qq_41344430的博客 3202

简述Spring技术内幕

相信任何一个开发者都使用过Spring这个框架,或许你刚开始使用Spring、或许你有看过源码解析系列文章、或许你曾调试过源码、或许你。。。总之不管你的情况如何,你有想过...

javaxuexilu的博客 269

一文学会Cadence Sigrity PDN仿真——硬件新手小白都能看懂的保姆级教程

电源完整性的仿真,实际上是在仿真以及优化系统中的等效串联电阻。知道了仿真以及优化的目标之后,接下来就是要弄明白这个串联电阻从哪儿来以及怎么优化。整个系统中的串联电阻实际上由三部分组成:没有相位的阻抗,有相位的容抗和感抗,得益于相位,在某个特定的频点,容抗和感抗会大小相等,相位相反而相互抵消,这时候整个系统中就剩下了阻抗,所以整个系统的串联电阻达到了一个最低值,这种现象就是----谐振。当系统处于谐振点时候,整个系统会有一个最小的串联电阻,所以第一个优化电阻的手段就是让谐振来的更频繁一点。

学习帮的博客 2万+

读书笔记-《Spring技术内幕》(四)事务

前面的类层次结构图有提到 AbstractPlatformTransactionManager,其定义了事务的生成、提交、回滚、挂起,对于不同的数据库有不同的实现。看到这种将非业务功能代码解耦出来,并通过注解(声明式)实现功能的操作,很容易猜到,其原理是通过 AOP 将事务处理的功能编织进来,本质上可以看作是一个。按照惯例,我们先从程序员的视角出发,看看 Spring 帮我们做了什么,再学习其具体的设计与实现。简单来说,这里的代码直接操作数据库连接,并且将事务处理代码和业务代码耦合,非常糟糕。

lbqjtyykx的博客 1222

[基于STM32底盘控制与ROS上层导航小车制作] 第一节 stm32电机驱动与编码器读取反馈

系列文章目录 第一节stm32电机驱动与编码器读取反馈 第二节 stm32电机pid控制 第三节 stm32线速度标定 第四节 stm32添加mpu6050得到angle角度 第五节 实现STM32与ubuntu系统下的ROS串口DMA通信,传输底盘速度等信息 第六节 ROS计算和发布里程计 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 系列文章目录 前言 1.pwm与电机正反转 2.编码器初始化 二、pwm控制与编码器使用 1.pwm使电机 .

LanLanLan1927的博客 1万+

CKA-CN考试之路----16

所以结合本题,如果有多个文件中都存在同一个值,务必统一,或者修改最后一个次序的文件。中以不同的文件名来区分不同目的的配置会更有利于阅读.就像本题中的。但当有多个文件中存在同一个参数的不同值,最后会生效哪个值?中,但随着配置越来越多不怎么容易阅读.当多个文件同时存在一个参数,但值又不同。有时候我们会将所有内存参数全部写在。确认服务状态(2个红框中的内容)

Q先生 301

spring技术内幕读书笔记--springmvc组件

今天对《spring技术内幕》一书中有关springmvc组件的章节做一个简单总结。springmvc的web环境配置<servlet> <servlet-name>application</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

czr19900428的博客 491

如何在飞腾平台上安装Ubuntu操作系统

注意: 若主板上配置的是NVME硬盘,在进行内核配置时,需要将内核的NEME驱动勾选上,否则移植内核时,无法找到文件系统,进不去操作系统。可以通过rufus软件将镜像做到U盘中,本次使用版本为Rufus 3.9.124 ,其他版本也可以。不要下载live版本的,没有准备网络环境,是一个头疼的事情,笔者暂时没有实现网络安装。将U盘接到主板usb口上,接上串口,显示器,,必需串口有打印才可以安装。可以通过dd命令,将iso安装到U盘。安装的是最小系统,缺少很多命令,需要联网更新,或则更换飞腾专用内核。

技术联盟 2645

Spring 技术内幕读书笔记

Spring的设计理念和整体架构 1.1 spring的各个子项目 1.1.1 spring framwork 核心, IoC容器设计,控制反转,AOP ,MVC ,JDBC ,事务处理 1.1.2 spring security 认证和安全工具 1.1.3 spring security OAuth 提供一个开放的协议的实现,进行简单而标准的安全调用 1.1.4 spring Intergration 与企业级应用系统的集成 1.1.5 spring social spring框架的扩展 1.1.6 ..

martin_violet的博客 263

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

spring技术内幕2读书笔记

第1章  准备源代码环境15 1.1  安装JDK15 1.2  安装Eclipse15 1.3  安装辅助工具16 1.4  获取Spring源代码22 1.5  Spring源代码的组织结构24 1.6  小结26          第一部分  Spring核心实现篇        第2章  Spring FrameWork的核心:IoC容器的实现30 2.1  Sprin

xingqinstar的专栏 639

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

《Spring技术内幕》——读书笔记1

不知什么时候开始,看书必看序。不会从正文第一章开始,更不会先从目录里找自己感兴趣的片段。哪怕是看金庸的武侠小说也会先看一遍作者写书时的心情,目的或者灵感的来源之类。可能如果真的想了解一本书写了什么,必须先知道它为谁而做。我是个爱读书但极其讨厌网络小说的人,虽然网络“写手”中也不乏优秀的作者,但实在是凤毛麟角。 《SPRING技术内幕:深入解析SPRING架构与设计原理》被称为Spring领域的问鼎...

weixin_43222373的博客 196

《Spring技术内幕》读书笔记

简介: 1.spring 与unix、window这些操作在计算机系统中起到的作用是类似的 2.两大核心模块:IOC\AOP 3.为应用开发提供了许多现成的系统组件:事务处理、Web MV、JDBC、O/R映射、远程调用等,这些组件可以在开源软件和商业产品中自由选择,重复体现了Spring的开放性。 第1章:Spring的设计理念和整体构架 1.IOC(依赖反转)可以使原来的对...

weixin_30642305的博客 100

《Spring技术内幕》读书笔记——Spring MVC

1、根上下文初始化 DispatcherServlet分发请求,可以配置多个,定义了URL映射;ContextLoaderListener是Spring MVC的启动类,被定义为一个与Web服务生命周期相关的监听器,负责完成IOC容器在Web环境中的启动。DispatcherServlet和ContextLoaderListener提供了在Web容器中对Spring的接口,这些接口与容器的耦合通...

weixin_39420024的博客 284

《Spring技术内幕》读书笔记——IoC源码

Inversion of Control,控制反转,又称Dependency Inversion Principle,依赖倒置,由容器来管理Bean。 1、BeanFactory继承体系 Spring定义BeanDefinition抽象Bean的定义,来管理对象和对象的依赖关系。 从BeanFactory到HierarchicalBeanFactory,到ConfigurableBean...

weixin_39420024的博客 301

《Spring技术内幕》读书笔记——AOP源码

1、Advice通知、Pointcut切点、Advisor通知器 Advice(通知)定义在连接点做什么,为切面增强提供织入接口。Spring AOP提供了BeforeAdvice、AfterAdvice、ThrowsAdvice等。MethodBeforeAdvice接口继承自BeforeAdvice,提供了void before(Method method, Object[] args, O...

weixin_39420024的博客 321

spring技术内幕读书笔记--IOC

今天对《spring技术内幕》一书中有关IOC容器实现的章节做一个简单总结。IOC容器的设计与实现 IoC容器设计中,两个主要的接口 1)BeanFactory:可以理解为IoC容器的抽象,提供了ioc容器的最基本API。 2)ApplicationContext:IoC容器的高级形态,在基础IoC容器上加了许多特性。 从继承图来理解:DefaultListableBeanFactory是IoC

czr19900428的博客 431

读书笔记-《Spring技术内幕》(三)MVC与Web环境

DispatcherServlet.render() 里面有两种情况,一种是在 ModelAndView 中设置了 View 的名称,需要调用 resolveViewName 方法获取 View,还有一种情况是 ModelAndView 里已经有 View 了,则直接使用(注意这里说的 render 方法是 DispatcherServlet 的,上面时序图里说的 render 方法是 View 的);不过现在都不涉及了,主流的应用都通过前后端分离的方式,将数据的展示交给前端开发处理。

lbqjtyykx的博客 1068

《深入分析JavaWeb技术内幕》读书笔记九.Spring,SpringMVC,MyBatis

这三个框架在JavaWeb项目中非常常见,书中也对它们进行了相关介绍,但书中讲的是iBatis,我这里则介绍MyBatis。这三个框架都非常优秀,也不是三言两语能讲清楚的,我这里只是对它们的架构和原理进行简单的介绍,具体应用请自行学习。 Spring Spring的骨骼架构 从这幅图中我们可以看出Spring的核心组件只有三个:Core、Context和Bean。它们构建起了整个Spri

路漫漫 始于足下 1207

spring技术内幕 读书笔记(一)

spring技术,spring源码,spring心得,spring,读书笔记

steven的博客 966
上一篇: 读书笔记——Java并发线程编程实战
刘五分
博客等级 码龄10年 15粉丝 11原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值