标签:死磕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中由一个具体类实现。
public class McChicken implements Food{ /* * 获取一份麦香鸡 */ public void get(){ System.out.println("我要一份麦香鸡"); } }
public interface Food { /* * 获得相应的食物 */ public void get(); }
public class Chips implements Food{ /* * 获取一份薯条 */ public void get(){ System.out.println("我要一份薯条"); } }
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文件
//用户 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
<?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="miyue@daqin.com"></property> <property name="cardList" > <list> <ref bean="beijingCard"/> <ref bean="jiansheCard"/> </list> </property> </bean> </beans>
2.3测试类
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); } } } }
返回结果
miyue@daqin.com
芈月
com.spring.examples.ioc.bean.Card@244071d
com.spring.examples.ioc.bean.Card@402f0214
至此,可以正式踏上阅读源码的征途了。
本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/1726509
标签:死磕spring
原文地址:http://dba10g.blog.51cto.com/764602/1726509