通过前面30章的学习,应该对java的基础及一些jvm底层有了初步了解,接来下将要剖析java最为成功的框架spring;通过剖析整个过程将帮助我们了解jvm底层运作和代码设计风格;
先来认识一下spring的缔造者:Rod Johnson; 搞音乐出生的,长的还有点丑,他提出了一个理念:不要滥造车轮子;意思是做车轮子很简单,现在已经有了比较优秀的js封装库像jQuery、nodejs等,而有些三流软件公司放着不用,偏要自己开发一套封装库,让不懂js的人以为这家公司很nb;这句话的另外一个意思:就是造轮子就要造出足够优秀的轮子;
他写了几本书:《Expert One-on-One J2EE Design and Development》spring核心思想,他的英文比较烂,一般人不知道他要说什么,估计还没人能翻译成能读的中文;《expert one-on-one J2EE Development without EJB》写了一本书在说EJB的坏话;《Professional Java Development with the spring framework》一看书名就是在给spring做广告;
spring有多优秀,那是一个关于春天的故事!
what you will learn from this book?《Professional Java Development with the spring framework》 1、The core inversion of control container(容器) and the concept(概念) of dependency injection(注入); IoC容器 2、Spring's aspect oriented(面向、定向) programming framework and why aop is important in j2ee development; AoP框架 3、How to use spring's programmatic(框架) and declarative transaction management services effectively; 4、how to access data using spring's JDBC functionality? 5、Spring services for accessing and implementing EJBs; spring为EJB提供访问和实现功能 6、Spring's remoting(扩展ing) framework; spring官网:http://spring.io/
先来熟悉几个概念:
1、控制反转:原先一个类A{private String name;} 的属性name需要在实例中为其赋值;比如skx.setName(“skx”);完成这个赋值过程是由 具体的对象实例 完成的;现在就是把这种赋值的权限交给IoC容器,由IoC为实例的属性赋值;比如<bean id="skx" class="org.spring.A"><property name="name" value="skx"/></bean>就完成了对实例属性的赋值;
2、紧耦合: 比如 A{private B b;}这里A就依赖于属性b,如果属性b的属性和方法发生了变化,极有可能影响到a的功能实现;
接口解耦:看过25章设计模式之结构模式的外观模式,就会知道如何实现解耦;
3、设计模式的开闭原则:查看27章设计模式之6大原则的开闭原则;
spring3.1
在spring所有功能中,最基础最核心的莫过于IoC了,而IoC容器的具体实现类都是实现BeanFactory这基本接口:
public interface BeanFactory { //这里是对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象, //如果需要得到工厂本身,需要转义 String FACTORY_BEAN_PREFIX = "&"; //这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就是一个大的抽象工厂。 Object getBean(String name) throws BeansException; //这里根据bean的名字和Class类型来得到bean实例。 Object getBean(String name, Class requiredType) throws BeansException; //这里提供对bean的检索,看看是否在IOC容器有这个名字的bean boolean containsBean(String name); //这里根据bean名字得到bean实例,并同时判断这个bean是不是单例 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; //这里对得到bean实例的Class类型 Class getType(String name) throws NoSuchBeanDefinitionException; //这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来 String[] getAliases(String name); }
一个Bean 的解析过程非常复杂,功能被分的很细,扩展了很多接口、抽象类和实现类,错综复杂、眼花缭乱,但是最终的实现类有:XmlBeanFactory,ClasspathXmlApplicationContext等等。
实箭头表示继承或实现父类或父接口,虚箭头表示依赖所指向的类或接口;
BeanFactory下的10个接口:
从上张图可以看出,ApplicationContext这个接口和最下面的三个接口应该是比较有用的接口;
下面来看下实现类的关系图:XmlBeanFactory主要接口是ConfigurableListableBeanFactory;黄框表示在前面的图中出现,不再向上追溯:
XmlBeanFactory声明过时了,来看下面4个现在比较常用的实现bean解析的类:
这张图中,AbstractApplicationContex、AbstractRefreshableConfigApplicationContextt和4个实现类比较重要;
在Spring中,所有的Bean都是有BeanFactory(IoC容器先可以理解为beans.xml)来进行管理的,在BeanFactory中设计了4个getBean方法,通过getBean来获得beans.xml文件中的bean,
返回类型:boolean 方法 :containsBean 返回类型:Object 方法 :getBean 返回类型:T 方法 :getBean 返回类型:T 方法 :getBean 返回类型:Object 方法 :getBean 返回类型:boolean 方法 :isSingleton 返回类型:boolean 方法 :isPrototype 返回类型:boolean 方法 :isTypeMatch 返回类型:Class<?> 方法 :getType 返回类型:String; 方法 :getAliases
返回类型:boolean 方法 :containsLocalBean 返回类型:BeanFactory 方法 :getParentBeanFactory //获得BeanFactory$1、Resource接口 Spring中,对于资源文件采用一个接口Resource表示。其主要实现类有ClassPathResource、FileSystemResource、UrlResource、ByteArrayResource、ServletContextResource和InputStreamResource。
![](http://dl2.iteye.com/upload/attachment/0101/6833/064eac92-501f-3f60-943d-33f8a4a8ddd6.jpg)