# yangl-spring **Repository Path**: yanglei199207/yangl-spring ## Basic Information - **Project Name**: yangl-spring - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-02 - **Last Updated**: 2021-12-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # yangl-spring ## 一些总结: - 一层一层的封装,合理运用组合、继承类或接口来赋予、增强类的相应功能 - **接口的运用**: - 通过暴露接口方法来进行非侵入式嵌入(例如:暴露BeanPostProcessor接口,实现该接口的类会优先于普通bean的实例化并可在bean实例化前对bean做一些初始化操作,例:aop织入) - BeanFactoryAware接口暴露了获取beanFactory的能力,继承该接口的类拥有操作beanFactory的能力,也就能具体的操作bean了。 - **模板方法模式以及hook方法的应用**:   例如: 在AbstractBeanFactory中规范了bean的加载,实例化,初始化,获取的过程。AutowireCapableBeanFactory里实现了hook方法(applyPropertyValues方法),该方法在AbstractBeanFactory#initializeBean方法中调用,AbstractBeanFactory中有默认的hook方法空实现。 - **工厂方法模式的应用**:例如:BeanFactory#getBean,由子类决定怎样去获取bean并在获取时进行相关操作。工厂方法把实例化推迟到子类。 - **外观(门面)模式的运用**:ClassPathXmlApplicationContext对 Resouce 、 BeanFactory、BeanDefinition 进行了功能的封装,解决 根据地址获取资源通过 IoC 容器注册bean定义并实例化,初始化bean的问题,并提供简单运用他们的方法。 - **代理模式的运用**: - 通过jdk的动态代理:jdk的动态代理是基于接口的,必须实现了某一个或多个任意接口才可以被代理,并且只有这些接口中的方法会被代理。 - 通过cglib动态代理:cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中的方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。 - **单例模式的运用**: - yangl-spring默认是单例bean,在AbstractApplicationContext#refresh里注册bean定义,初始化后,默认用单例形式实例化bean:preInstantiateSingletons方法里获取beanDefinition的name后通过getBean(name)方法实例化bean,下次再getBean(name)时会先检查该name的beanDefinition里的bean是否已经实例化,如果已经实例化了,则返回那个bean的引用而不是再实例化一个新的bean返回 - 标准单例模式中一般的实现方式是:第一次通过getInstance(双重检查)实例化该类的对象并保存,下次再getInstance时返回该对象。 - **策略模式**:   这里有个想法,看ClassPathXMLApplicationContext构造方法可以知道是默认用自动装配的策略,在这里可以另外自己写个类继承AbstractBeanFactory,重写applyPropertyValues方法实现装配策略,在初始化的时候就可以选择不同的装配策略了。 ## 抽象类与接口的区别 > 设计思想不同,使用动机不同. ​ 抽象类和接口设计的时候,设计思想不同. - 设计抽象类是自下而上的过程,因为调用者子类需要某些属性和特有行为,所以调用者继承抽象类 - 设计接口是自上而下的过程,接口规范某一行为,我某类需要这个行为,调用者实现某接口 - 开发者使用的时候,使用动机不同. 开发者继承抽象类是为了使用抽象类的属性和行为; 开发者实现接口只是为了使用接口的行为. ### **区别总结:** - 区别一: 抽象类只能单继承,接口能多实现 - 区别二: - 抽象类是一个类,可以被任意权限修饰符修饰,静态和非静态属性,final和非final属性,可以有[抽象方法](https://www.zhihu.com/search?q=抽象方法&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"answer"%2C"sourceId"%3A117886746})和非抽象方法; - 接口只能被public,final修饰,只能有[静态方法](https://www.zhihu.com/search?q=静态方法&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"answer"%2C"sourceId"%3A117886746}),即使没有显示的声明,而且是不可修改的; - 区别三: - 抽象的事物不同: 抽象类是对类的抽象,接口是对行为的抽象; - 抽象类是对整个类抽象,包括属性,行为; - 接口是对类的行为(局部)进行抽象; - 区别四: 定义的时候,定义抽象类和接口的思想不同; - 设计抽象类是自下而上的过程,我子类需要,所以我定义抽象类; - 设计接口是自上而下的过程,我接口规范某一行为,我某类需要这个行为,我实现某接口; ### 核心区别: 调用者使用动机不同,实现接口是为了使用他规范的某一个行为; 继承抽象类是为了使用这个类属性和行为. ### 再简单点说: 我们知道抽象类是从子类中发现公共部分,然后泛化成抽象类,子类继承该父类即可,但是接口不同。实现它的子类可以不存在任何关系,共同之处。例如猫、狗可以抽象成一个动物类抽象类,具备叫的方法。鸟、飞机可以实现飞Fly接口,具备飞的行为,这里我们总不能将鸟、飞机共用一个父类吧!所以说抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"[is](https://link.zhihu.com/?target=http%3A//www.mydown.com/soft/network/chat/475/444475.shtml)-a" 关系,即父类和[派生类](https://www.zhihu.com/search?q=派生类&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"answer"%2C"sourceId"%3A117886746})在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的, 仅仅是实现了接口定义的规则而已。 参考: https://www.zhihu.com/question/28887491/answer/117886746 https://www.zhihu.com/question/263729188/answer/272345092 ## Git 基本操作 Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。 Git 常用的是以下 6 个命令:**git clone、git push、git add 、git commit、git checkout、git pull** ![img](https://pic2.zhimg.com/80/v2-3699764e4e1f909e531a9183749b38d9_720w.jpg) **说明:** - workspace:工作区 - staging area:暂存区/缓存区 - local repository:版本库或本地仓库 - remoterepository:远程仓库 ### 简单的操作步骤 ```js $ git init //初始化仓库。 $ git add . // 添加文件到暂存区。 $ git commit //将暂存区内容添加到仓库中。 ``` ### 创建仓库 > 下表列出了 git 创建仓库的命令: | 命令 | 说明 | | --------- | ------------------------------------ | | git init | 初始化仓库 | | git clone | 拷贝一份远程仓库,也就是下载一个项目 | ### 本地项目关联到远程仓库 | 命令 | 说明 | | ------------------------------------------------------------ | -------------- | | git remote add origin [https://github.com/xienb/NPC.git](https://link.zhihu.com/?target=https%3A//github.com/xienb/NPC.git) | 关联到远程仓库 | ### 提交与修改 > Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。 下表列出了有关创建与提交你的项目的[快照](https://www.zhihu.com/search?q=快照&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A409789422})的命令: | 命令 | 说明 | | ------------------------------------------------------------ | -------------------------------------- | | git add | 添加文件到仓库 | | git status | 查看仓库当前的状态,显示有变更的文件 | | git diff | 比较文件的不同,即暂存区和工作区的差异 | | git commit -m “备注” | 提交暂存区到本地仓库 | | [git reset](https://www.zhihu.com/search?q=git+reset&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A409789422}) | 回退版本 | | git reset HEAD | 用于取消已缓存的内容 | | git rm | 删除工作区文件 | ### 提交日志 | 命令 | 说明 | | ------------------------- | ------------------------------------ | | git log | 查看历史提交记录 | | git log --oneline | 查看历史记录的简洁的版本 | | git log --oneline --graph | 查看历史中什么时候出现了分支、合并 | | git blame | 以列表形式查看指定文件的历史修改记录 | ### [远程操作](https://www.zhihu.com/search?q=远程操作&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A409789422}) | 命令 | 说明 | | ------------------------------------------------------------ | ------------------ | | [git remote](https://www.zhihu.com/search?q=git+remote&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A409789422}) | 远程仓库操作 | | git fetch | 从远程获取代码库 | | [git pull](https://www.zhihu.com/search?q=git+pull&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A409789422}) | 下载远程代码并合并 | | [git push](https://www.zhihu.com/search?q=git+push&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A409789422}) | 上传远程代码并合并 | ### 分支管理 | 命令 | 说明 | | ------------------------------------- | ------------------------------------------------------------ | | git branch (branchname) | 创建分支命令 | | git checkout (branchname) | 切换分支命令 | | git merge (branchname) | 合并分支命令 | | git pull origin (branchname) | 从[远程分支](https://www.zhihu.com/search?q=远程分支&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A409789422})(branchname)合并到当前分支 | | git branch -r | 查看远程分支 | | git branch -vv | 查看分支详细信息 | | git fetch | 同步远程仓库 | | git branch -d (branchname) | 删除分支 | | git checkout -b (branchname) | 创建并切换到分支 | | git push origin (branchname) | 创建远程分支 | | git checkout -b feature origin/dev | 从远程分支dev创建本地分支feature | | git push origin --delete (branchname) | 删除远程分支dev | | git remote updata origin -p* | 更新远程分支列表 | ### 标签管理 | 命令 | 说明 | | -------------------------------------------------------- | ------------------------------------------------------------ | | git tag | 查看所有标签名称 | | git tag -ln | 显示标签名及其描述信息 | | git tag (tag_name) | 为当前分支指向的commit记录创建标签 | | git tag (tag_name) (hash_val) | 为指定的commitId创建标签 | | git tag -a (tag_name) -m "msg" (hash_val) | 合并分支命令 | | git tag -d (tag_name) | 删除本地的标签 | | git push origin (tag_name) | 将标签推送到远程服务器 | | git push origin --tags | 将本地的全部tag推送到远程服务器 | | git push (remote_name) :refs/tags/(tag_name) | 删除[远程标签](https://www.zhihu.com/search?q=远程标签&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A409789422}) | | git archive --format=zip --output=src/xxx.zip (tag_name) | 标签内容提取:提取为zip格式,src可以是相对路径,也可以是绝对路径 | | git checkout (tag_name) | 切换到指定标签 | 编辑于 2021-09-29 10:10