死磕Spring系列之一:准备阅读Spring源码环境
死磕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类图
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 = "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