死磕Spring系列之一:准备阅读Spring源码环境

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dba10g.blog.51cto.com/764602/1726509

死磕Spring系列前言

死磕spring系列博客,是对Spring进行源码级阅读。工作以来,一直接触spring框架,可以说对spring框架的配置使用已经非常熟练了。个人感觉:Spring技术非常强大,简单的xml标签配置,就可以开启非常强大的支持功能,囊括J2EE企业应用的方方面面。使用归使用,但是却对spring底层设计和实现,一知半解。“到底是什么优秀的设计,能让Spring无所不能,无所不包”。最后,就有了我想研读Spring 源码的动力。

阅读任何任何一门框架源码,其实和普通业务系统一样,都是一个****,耗时耗力。虽然,spring相关书籍多如牛毛,但大多数都是介绍如何使用方面的书,对spring源码剖析的书却非常少。众里寻他千百度,《Spring源码深度解析》正式我需要的它。当然,我研磨spring源码,也会参照很多很多的资料和书籍,最后形成自己的知识框架,最后记录成果,也就是本系列博客。

研磨Spring源码,前面说了,耗时耗力,但也会有很大的收获。

1.温故而知新,可以加深对过往的spring应用知识理解

2.熟知spring内在机制,学习其中的扩展性和实现设计思路,可提高个人系统设计能力。

3.在技术层面,可以探究一些常用设计模式,是如何落地的。

4.提高阅读源码能力

5.多次面试经验表明,作为工作多年的老鸟,对spring光做到如何使用远远不够,这些刚工作的都会了。

死磕Spring系列主要内容和特点

1.不会大片大片的复制粘贴源码

2.重在设计思路和模式

3.逆向编程工具:Architexa

4.描述工具:设计类图,序列图,流程图

5.学习过程:实例+大胆个人假设+源码论证

6.逐级深入

1.认识工厂模式,体会工厂模式的好处

总所周知,整个spring容器其实就是一个个大大的工厂。介绍BeanFactory之前,先需要了解什么是工厂模式吧

工厂模式主要是为创建对象提供了接口,分为三类

1. 简单工厂模式(Simple Factory) 
2. 工厂方法模式(Factory Method) 
3. 抽象工厂模式(Abstract Factory) 

以简单工厂为例,其他2个工厂模式类同,重在体会什么是工作模式的意义。

1.1类图

死磕Spring系列之一:准备阅读Spring源码环境

1.2简单工厂模式
顾名思义,这个模式本身很简单,而且使用在业务较简单的情况下。
它由三种角色组成(关系见下面的类图):
1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

1
2
3
4
5
6
7
8
public class McChicken implements Food{
    /*
     * 获取一份麦香鸡
     */
    public void get(){
        System.out.println("我要一份麦香鸡");
    }
}
1
2
3
4
5
6
public interface Food {
    /*
     * 获得相应的食物
     */
    public void get();
}
1
2
3
4
5
6
7
8
public class Chips implements Food{
    /*
     * 获取一份薯条
     */
    public void get(){
        System.out.println("我要一份薯条");
    }
}


1
2
3
4
5
6
7
8
9
10
11
12
public class SimpleFactory {
    public static Food getFood(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        if(type.equalsIgnoreCase("mcchicken")) {
            return McChicken.class.newInstance();
        else if(type.equalsIgnoreCase("chips")) {
            return Chips.class.newInstance();
        else {
            System.out.println("哎呀!找不到相应的实例化类啦!");
            return null;
        
    }
}

1.3意义

简单工厂模式分离产品的创建者和消费者,有利于软件系统结构的优化。当然,简单工厂模式也有自身缺点,由于和主题不符,不再赘述了。spring对外提供了对象工厂接口,就是BeanFactory,和上文说的简单工厂模式作用差不多,但比他功能更强大。


2.认识工厂模式,体会工厂模式的好处

开始学习源码之前,需要有工作要做。

1.准备源码

2.准备IDE+构建工具

3.安装Architexa

4.配置好环境,跑一个spring版的"HELLO WORLD"

5.日志


 2.1Class文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//用户
public class User {
    private String userName;
    private String email;
    private List<Card> cardList;
...
}
//银行卡
public class Card {
    private int cardNo;
    private String bank;
    private int type;    
...
}

2.2配置文件IOCBeanFactoryTest.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
        <bean id="beijingCard" class="com.spring.examples.ioc.bean.Card">
            <property name="cardNo" value="6220-52103-4123-456"></property>
            <property name="bank" value="北京银行"/>
        </bean>
        <bean id="jiansheCard" class="com.spring.examples.ioc.bean.Card">
            <property name="cardNo" value="6227-52103-4123-456"></property>
            <property name="bank" value="建设银行"/>
        </bean>
 
        <bean id="miyue"  class="com.spring.examples.ioc.bean.User" primary="true"  scope="singleton">
            <property name="userName" value="芈月"></property>
            <property name="email" value="[email protected]"></property>
            <property name="cardList" >
                <list>
                        <ref bean="beijingCard"/>
                        <ref bean="jiansheCard"/>
                </list>
            </property>
        </bean>
</beans>

2.3测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class IOCBeanFactoryTest {
    public static void main(String[] args) {
        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();//构造工厂
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);//新增Xml阅读器
        reader.loadBeanDefinitions(new ClassPathResource("IOCBeanFactoryTest.xml"));//规则注册入容器
        Object bean = factory.getBean("miyue");
        if(bean!=null){
            User miyue = (User)bean;
            System.out.println(miyue.getEmail());
            System.out.println(miyue.getUserName());
            List<Card> cardList = miyue.getCardList();
            for(Card c:cardList){
                System.out.println(c);
            }
        }
    }
}

返回结果

[email protected]
芈月
[email protected]
[email protected]

至此,可以正式踏上阅读源码的征途了。

本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/1726509