总纲
【Java】【系列篇】【Spring源码解析】【二】【整体】【Spring整体流程解析】
【Java】【系列篇】【Spring源码解析】【三】【体系】【ApplicationContext体系】
【Java】【系列篇】【Spring源码解析】【三】【体系】【Aware体系】
【Java】【系列篇】【Spring源码解析】【三】【体系】【BeanDefinition体系】
【Java】【系列篇】【Spring源码解析】【三】【体系】【BeanFactory体系】
【Java】【系列篇】【Spring源码解析】【三】【体系】【Environment体系】
【Java】【系列篇】【Spring源码解析】【三】【体系】【PostProcessors体系】
【Java】【系列篇】【Spring源码解析】【三】【体系】【Registry体系】
【Java】【系列篇】【Spring源码解析】【三】【体系】【Resource体系】
【Java】【系列篇】【Spring源码解析】【三】【体系】【事件发布体系】草稿状态
【Java】【系列篇】【Spring源码解析】【四】【详解】【BeanDefinition载入时机】草稿状态
【Java】【系列篇】【Spring源码解析】【四】【详解】【SpringBean生命周期】 草稿状态
解释说明
本来本章是想要将Spring的整体结构设计什么的详细讲解一下的,不过看源码是真的累(其实是整理笔记累),所以就暂时这样简单了事,等缓过一阵子,在详细整理一番。
下面的设计模式也只是草稿,暂存,留作后用。
上面的那些文章都只是针对Spring源码的简单说明,目的是为了让那些需要阅读源码的人,对Spring源码框架有个大致的了解,特别是体系类的文章,更多的对里面的方法
释义,还有很多地方优化,而且里面的内容都是我根据网上的一些文章以及官方文档里面摘抄的,只能说仅供参考。
上面排序并非阅读文章的顺序,其实各个体系各有牵扯,都需要去看看,更需要自己本人实际操作,有时候还需要调试源码。
我当时反反复复看了几次源码,开始时看不懂,特别是当时对Spring整体流程解析始终不甚明白,因为我当时的目的就是为了了解BeanDefinition载入时机以及SpringBean生
命周期,但是那时还不了解PostProcessors是什么东西,以及xml方式和注解方式加载BeanDefinition的不同,看的我头昏眼花,后来终于把PostProcessors体系里的工厂
后置处理器给搞明白了,才有了切入点,后续又去了解BeanFactory体系以及ApplicationContext体系,才对Spring源码的整体流程有个大致的结构。虽然至今仍对Spring
源码没有太深入的理解,但是大致的结构还是懂了一点点的。也算是学到了点东西。
设计模式-谈谈我对工厂模式的理解
如何去理解这个工厂模式呢?就从大众而言,在网上搜索,你就可以知道目前工厂模式有三个变种,简单工厂模式、工厂方法模式和抽象工厂模式;当然,有的人可能不认为简单工厂模式,认为只有后面两种;我们且不论到底有几种,但我们去理解这个工厂模式的前提是什么?我们首先要明白不管他们如何变种,他们都属于工厂模式,实现的方式有很多种,但是本质是不会变的。
在工厂模式里,只有两个角色:一个是工厂(抽象和具体),另一个是产品(抽象和具体);工厂的作用就是创建产品。至于我们如何去实现这两个角色,则看我们实际的业务场景,但你只要包含了这两个角色,你就是在使用工厂模式。
现在我们再来看这三个变种:
简单工厂模式
一个类里面有一个静态方法(方法是不是静态无所谓,纯粹看个人喜好;不过一般都是静态,毕竟直接调用就能解决的事,为什么还要new一个),在这个方法里你可以看到if-else,每一个分支里面都是创建产品的代码,而这个类就是所谓的工厂。(不符合设计模式的开闭原则,不属于23中设计模式之一)
------------------------------------产品相关-----------------------------------------
interface Human{
public void eat();
}
// 创建实现类 Male
class Male implements Human{
public void eat(){
System.out.println("Male can eat.");
}
}
//创建实现类 Female
class Female implements Human{
public void eat(){
System.out.println("Female can eat.");
}
}
------------------------------------工厂相关-----------------------------------------
class HumanFactory{
public static Human createHuman(String gender){
if( gender.equals("male") ){
return new Male();
}else if( gender.equals("female")){
return new Female();
}else {
System.out.println("请输入正确的类型!");
return null;
}
}
}
工厂方法模式
工厂方法模式相对于简单工厂模式其实没啥区别,就我看来,其实就是写法上面规范了些,但本质没变化。(BeanFactory和FactoryBean就是运用了此种工厂模式)
//产品部分代码省略,同上
interface HumanFactory {
Human createHuman();
}
class MaleFactory implements HumanFactory {
public Human createHuman() {
return new Male();
}
}
class FemaleFactory implements HumanFactory {
public Human createHuman() {
return new Female();
}
}
//调用逻辑
public static void test(Stirng humanType) {
HumanFactory humanFactory;
if ("Male".equals(humanType)) {
humanFactory = new MaleFactory();
} else {
humanFactory = new FemaleFactory();
}
Human human = humanFactory.createHuman();
human.eat();
}
//注:这一种的话,看起来逼格高了些,但是每有一个产品就会新增一个类,如果产品很多,增加的成本就很多了。
抽象工厂模式
抽象工厂模式与工厂方法模式的区别就是特性一和多的区别;什么叫特性?就是一个产品你可以有几种分类方式。比如上面的例子,我们只能将人分为男人和女人;但是如果我们再往里面添加一个特性,比如黄种人、黑人、白人;那么我们就有两种分类方式(基于性别、基于人种)。这种时候,我们就可以基于这两种方式分类。(不知道为什么要把抽象工厂模式和工厂方法模式区分开来,感觉多此一举)
interface Human{
public void eat();
}
interface HumanType{
public void color();
}
interface RealHuman extends Human,HumanType {
}
class YellowMale implements RealHuman{
public void eat(){
System.out.println("Male can eat.");
}
public void color(){
System.out.println("Male is yellow.");
}
}
class YellowFemale implements RealHuman{
public void eat(){
System.out.println("Female can eat.");
}
public void color(){
System.out.println("Female is yellow.");
}
}
...黑人黄人一样
第一种:基于男人和女人
interface HumanFactory {
RealHuman createYellowHuman();
RealHuman createBlackHuman();
RealHuman createWhiteHuman();
}
class MaleFactory implements HumanFactory {
public RealHuman createYellowHuman() {
return new YellowMale();
}
public RealHuman createBlackHuman() {
return new BlackMale();
}
public RealHuman createWhiteHuman() {
return new WhiteMale();
}
}
class FemaleFactory implements HumanFactory {
public RealHuman createYellowHuman() {
return new YellowFemale();
}
public RealHuman createBlackHuman() {
return new BlackFemale();
}
public RealHuman createWhiteHuman() {
return new WhiteFemale();
}
}
第二种:基于人种
interface HumanFactory {
RealHuman createMaleHuman();
RealHuman createFemaleHuman();
}
class YellowFactory implements HumanFactory {
public RealHuman createMaleHuman() {
return new YellowMale();
}
public RealHuman createFemaleHuman() {
return new YellowFemale();
}
}
class BlackFactory implements HumanFactory {
public RealHuman createMaleHuman() {
return new BlackMale();
}
public RealHuman createFemaleHuman() {
return new BlackFemale();
}
}
class WhiteFactory implements HumanFactory {
public RealHuman createMaleHuman() {
return new WhiteMale();
}
public RealHuman createFemaleHuman() {
return new WhiteFemale();
}
}
还有一些其他的例子,比如多选框按钮与单选框按钮,苹果的按钮和安卓的按钮。不管实现的方式如何,只要抓住核心,就没什么无法理解的,没必要追求一模一样。我们最终的目的是解决业务问题。