参考链接: 用子类引用子类对象 vs 父类引用 这是java并发编程实践中有关重入概念的介绍时产生的问题 public class Widget { public synchronized...System.out.println(toString() + ": calling doSomething"); super.doSomething(); } } 子类继承父类...,重写父类的synchronized方法,两个synchronized方法的锁对象的问题 是同一个锁还是不同锁呢,是同一个锁的话是 父类对象作为锁还是子类对象作为锁呢? ...something else 说明肯定是同一对象 另外main方法里最后那步执行的对象是子类,按着定义,谁调用方法谁作为锁,所以这个一定是子类对象,那么super.doSomething()这个方法一定也是子类对象...,至于理解么: 可以认为即便是继承创建了父类对象,并把父类对象的引用交给了子类,但是在super.去调用方法的时候JVM认为调用者依然是子类。
field.setAccessible(true); for (int j = 0; j 的属性值
父类和子类对象的获取值的方式验证,通过父类属性的方式获取不到值,需要使用get方法 静态属性通过类.属性的方式获取,对象获取使用get方法获取 package com.example.core.mydemo.java...String channelName) { this.channelName = channelName; } /** * partnerName: //通过父类属性的方式获取不到值...,需要使用get方法 * channelName: //通过父类属性的方式获取不到值,需要使用get方法 * partnerName2:合作商名称 * channelName2...* channelName3:渠道商名称 //对象自身的属性值可以获取 * partnerName4:合作商名称 * channelName4:渠道商名称...* MAX=100 静态属性通过类.属性的方式获取,对象获取使用get方法获取 * @param args */ public static void main(String
@Cacheable使用两个或多个参数作为缓存的key 常见的如分页查询:使用单引号指定分割符,最终会拼接为一个字符串 @Cacheable(key = "#page+'-'+#pageSize") public...int pageStart = (page-1)*pageSize; return userMapper.findAllUsers(pageStart,pageSize); } 当然还可以使用单引号自定义字符串作为缓存的
,这些属性对象都是Spring管理的; 实例化一个类型,并自动装配,这些属性对象都是Spring管理的,实例化的类可以不被Spring管理(这点特别重要)。...通过暴露此功能,Spring框架之外的程序,y也能具有自动装配的能力(此接口赋予它的)。 可以使用这个接口集成其它框架。...**它是整个bean加载的核心部分,也是spring注册加载bean的默认实现 DefaultListableBeanFactory既可以作为一个单独的beanFactory,也可以作为自定义beanFactory...(代码的可读性异常的重要,特别像Spring这种持久性的项目) 不同接口的实现,分布在不同的之类里,方便以后不同接口多种实现的扩展(单一职责,才好扩展。...具有良好的结构设计和接口抽象,它的每一个接口都是其功能具体到各个模块中的高度抽象,实际使用过程中相当于把接口的各个实现类按照接口所提供的组织架构装配起来以提供完整的服务,可以说掌握了Spring的接口就相当于掌握了
@Autowired则用在属性上,Spring检测到该注解之后就会在IoC容器中查找是否有与该属性相匹配的类或子类实例,有的话就注入到当前属性中,否则就会报错。...继承 bean的类之间具有继承关系 对于具有继承关系的bean,由于父类的属性,子类也会有,因而如果直接配置,那么两个bean的配置将会有很大一部分趋于相似。...这里可以使用parent属性用来将父类已经注入的bean继承给子类bean,子类bean可以只更改其中实现与父类有区别的bean。...bean,并且指明子类与父类有差异的属性bean。...提取公共bean并进行继承 对于两个或多个bean,如果其大部分属性bean都是相似的,只有少部分不一致,那么就可以将公共的bean提取出来作为父bean,然后每个bean继承自这个bean
class属性定义了这个 Bean 的全限定类名(包名+类名)。Spring 能管理几乎所有的 Java 类。一般情况,这个 Java 类会有一个默认的构造函数,用set方法设置依赖的属性。...它可以是任意的字母符合。多个别名之间用逗号或空格分开。 (3)class: 用来定义类的全限定名(包名+类名)。只有子类 Bean 不用定义该属性。...(4)parent: 子类 Bean 定义它所引用它的父类 Bean。这时前面的 class 属性失效。...子类 Bean 会继承父类 Bean 的所有属性,子类 Bean 也可以覆盖父类 Bean 的属性。注意:子类 Bean 和父类 Bean 是同一个 Java 类。...它表示这个 Bean 将不会被实例化,一般用于父类 Bean,因为父类 Bean 主要是供子类 Bean 继承使用。
从这个继承关系中我们也能看出,Spring在设计时将消息的获取以及格式化进行了分隔。而在我们实际使用到具体的实现类时,又将功能做了聚合。...Profile中,也可以通过XML的形式 Environment主要决定哪个Profile要被激活,在没有激活的Profile时要使用哪个作为默认的Profile 注解方式(@Profile) 1、简单使用...(DmzService,IndexService)配置了不同的profile,可以看到当我们利用Environment激活不同的Profile时,可以分别只创建不同的两个类。...为什么它不直接使用父类的containsProperty方法而要自己复写一个呢?...,主要要知道Environment完成了两个功能 为程序运行提供不同的剖面,即Profile 操作程序运行中的属性资源 整个Environment体系可以用下图表示 ?
此处注意:它是个Bean工厂的后置处理器,而不是Bean的后置处理器 它抽象了容器启动时,BeanFactory后置处理阶段对容器中所有bean定义中的属性进行配置的一般逻辑,属性配置所使用的属性来源是基类...是一个抽象基类,它抽象了从不同渠道加载属性的通用逻辑,以及这些属性应用优先级上的一些考虑,它所提供的这些功能主要供实现子类使用。...从此抽象类命名就能看出,它的子类们肯定都和Placeholder处理占位符有关。 它的父类已经定义了后置处理阶段对容器中所有bean定义属性进行处理。...Spring 对于Properties的操作都是分别基于上面两个类,而且两个类的实现方式是不一样的。...它是对父类的增强,它能解决如下两个可能问题: 配置文件不能放在主目录中,因为某些OS(如Win9X)没有主目录的概念 没有标准的文件命名规则,存在文件名冲突的可能性 使用java.util.prefs.Preferences
,其相互关系如下: 其中BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范,BeanFactory 有三个子类:ListableBeanFactory、HierarchicalBeanFactory...对于bean的查找可以在这个上下文体系中发生,首先检查当前上下文,其次是父上下文,逐级向上,这样为不同的Spring应用提供了一个共享的bean定义环境。...通过这两个方法的源码我们可以看出,我们既可以使用一个字符串来配置多个Spring Bean定义资源文件,也可以使用字符串数组,即下面两种方式都是可以的: a....注意:在解析Bean>元素过程中没有创建和实例化Bean对象,只是创建了Bean对象的定义类BeanDefinition,将Bean>元素中的配置信息设置到BeanDefinition中作为记录,当依赖注入时才使用这些记录信息创建和实例化具体的...,在Spring中,BeanPostProcessor的实现子类非常的多,分别完成不同的操作,如:AOP面向切面编程的注册通知适配器、Bean对象的数据校验、Bean继承属性/方法的合并等等,我们以最简单的
假设我们有一个通用的基础服务层 bean,而不同的业务模块需要在此基础上进行扩展。通过使用 parentName 属性,我们可以为每个业务模块定义一个派生 bean,并在其中添加特定于模块的配置。...这种层次结构的定义使得我们可以更好地组织和管理不同模块之间的 bean。 通过使用 parentName 属性,我们可以轻松地创建和管理 bean 的层次结构。...,用于定义类之间的父子关系,子类继承父类的属性和方法。...语法和用法:在 Java 中,继承是通过使用关键字 extends 来实现的,子类通过继承父类来获得父类的属性和方法。...而在 Spring 中,通过在 BeanDefinition 中配置 parentName 属性来指定一个 bean 的父 bean,从而继承父 bean 的配置。
使用继承 – 编写父类 – 编写子类, 继承父类 class Animal { //公共的属性和方法 } class Chicken extends Animal{ //子类特有的属性和方法 } class...类(父类/超类)和Chicken类(子类)连接接起来; 在继承关系下,Chicken类将拥有Animal类所有的非私有的方法和属性,Chicken类还可以拥有自己独有的方法和属性; 声明Animal类,...重载:方法重载(overload)是指在同一个类中的多个方法可以同名但参数列表必须不同。重载表现为同一个类中方法的多态性。 重写:方法重写(override)是指子类冲定义了父类中同名的方法。...(父类引用指向子类对象。) 向下转型:只能针对指向子类对象的基类对象引用进行 。 向上转型:子类对象转为父类对象。此处父类对象可以是接口。...当两个不同的键对象的hashcode相同时,它们会储存在同一个bucket位置的链表中,可通过键对象的equals()方法来找到键值对。
,抽象后的实体就是BeanDefinition,并且Spring会以此作为标准来对Bean进行创建 BeanDefinition包含以下元数据: 一个全限定类名,通常来说,就是对应的bean的全限定类名...BeanMetadataAttribute,然后就调用了父类的方法,将其放入到map中。...; // 默认情况作为自动注入的候选bean private boolean autowireCandidate = true; // 默认情况不作为优先使用的bean private boolean...当我们在一个配置类中使用了@Bean注解时,被@Bean注解标记的方法,就被解析成了FactoryMethodMetadata。...BeanDefinition的具体使用的子类,以及Spring在哪些地方使用到了它们。这部分内容在后面的学习中很重要,画图总结如下: ?
其中BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范,BeanFactory 有三个子类:ListableBeanFactory、HierarchicalBeanFactory...对于bean的查找可以在这个上下文体系中发生,首先检查当前上下文,其次是父上下文,逐级向上,这样为不同的Spring应用提供了一个共享的bean定义环境。...通过这两个方法的源码我们可以看出,我们既可以使用一个字符串来配置多个Spring Bean定义资源文件,也可以使用字符串数组,即下面两种方式都是可以的: a....注意:在解析Bean>元素过程中没有创建和实例化Bean对象,只是创建了Bean对象的定义类BeanDefinition,将Bean>元素中的配置信息设置到BeanDefinition中作为记录,当依赖注入时才使用这些记录信息创建和实例化具体的...BeanPostProcessor是一个接口,其初始化前的操作方法和初始化后的操作方法均委托其实现子类来实现,在Spring中,BeanPostProcessor的实现子类非常的多,分别完成不同的操作,
AbstractBeanDefinition AbstractBeanDefinition是抽象类,它是众多子类的父类。...AbstractBeanDefinition 其实已经涵盖了所有属性了,spring为什么要提供这么多的子类?正所谓,既生瑜何生亮!...笔者认为,完全可以用一个AbstractBeanDefinition 代替所有的子类,只不过spring为了模块化,不同的BeanDefinition可能从代码角度来讲都一样,但是从设计角度来讲我们要模块化...*/ @Nullable MethodMetadata getFactoryMethodMetadata(); } 这两个方法是在子类中实现的,我们先查看这两个方法返回的具体信息...@Bean注解注释的类会使用构造函数自动装配。
手写IOC总结 手写IOC使用的设计模式 符合大部分设计原则 整个设计和Spring的设计还是有一定的出入 ---- Spring核心架构 Spring大约有20个模块,由1300多个不同的文件构成...,主要包含id(即对象的名称),class(需要交由spring管理类的全类名)及子标签property数据 //用来封装bean标签数据 //id属性,class属性,property子标签数据 @Data...作为ApplicationContext接口的子类,所以该类也是非延时加载,所以需要在该类中顶一个Map集合,作为bean对象存储的容器 声明BeanDefinitionReader类型的变量,用来进行...) { //调用父类的getBean方法,获取对应的bean对象 //getBean方法的具体实现,有对应的子类完成 //getBean...类中的finishBeanInialLization()方法调用了子类的getBean()方法,因为getBean的实现和环境息息相关 迭代器模式: 对于MultablePropertyValues类定义使用到了迭代器模式
的创建,依赖注入和初始化 BeanDefinition作为bean的设计蓝图,规定了bean的特征,如单例多例,依赖关系,初始摧毁方法等 BeanDefinition的来源具有多样化,包括xml文件获取.../* 应用场景 */ 为父类设计子类,且子类不用继承父类繁杂的方法 /* 具体使用 */ org.springframework.web.util.ContentCachingRequestWrapper...它的本质就是固定算法框架。 /* 应用场景 */ 让父类控制子类方法的调用顺序 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。...一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。...需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。
,在 Java 中通过extends关键字来实现继承,子类可以直接使用父类中已定义好的属性和方法,还可以添加自己特有的属性和方法,实现功能的扩展。...继续也具备传递性,如果类 C 继承自类 B,类 B 继承自类 A,那么类 C 不仅继承了类 B 的属性和方法,也间接继承了类 A 的属性和方法。 多态是指同一个操作在不同对象上可以表现出不同的行为。...多态实现方式有两种: 运行时多态:基于方法重写(Override),通过父类引用调用子类对象,比如,父类Animal中有void sound()方法,子类Dog重写这个方法后实现自己特有的 “汪汪” 叫的声音...反射具有以下特性: 运行时类信息访问:反射机制允许程序在运行时获取类的完整结构信息,包括类名、包名、父类、实现的接口、构造函数、方法和字段等。...Spring框架如何解决循环依赖问题? 循环依赖指的是两个类中的属性相互依赖对方:例如 A 类中有 B 属性,B 类中有 A属性,从而形成了一个依赖闭环,如下图。
bean的定义信息进行了抽象,抽象后的实体就是BeanDefinition,并且Spring会以此作为标准来对Bean进行创建 BeanDefinition包含以下元数据:一个全限定类名,通常来说,就是对应的...BeanMetadataAttribute,然后就调用了父类的方法,将其放入到map中。...; // 默认情况作为自动注入的候选bean private boolean autowireCandidate = true; // 默认情况不作为优先使用的bean private boolean...我在5.1.x版本没有找到使用这个类的代码。...BeanDefinition的具体使用的子类,以及Spring在哪些地方使用到了它们。
领取专属 10元无门槛券
手把手带您无忧上云