Spring第一章读书笔记
依赖注入
Spring做了很多事,但是Spring最重要的是以下两个特性:
依赖注入(dependency injection),简称DI
面向方面编程(aspect-oriented programming),简称AOP
这两个特性有着共同的编程思想,就是每个模块或类都专注于自己做的事,尽量做到松耦合,高内聚,尽可能可重用。依赖注入是在实例管理上做到这一点,而面向方面编程是在业务逻辑上做到这一点。
依赖注入这个词,听起来吓人,让人想到复杂的编程技术和设计模式。但其实并不复杂,使用依赖注入后,代码会明显变得简单、易读、容易测试。
依赖注入在处理类与类之间的引用上发挥作用。什么是依赖?类A要使用类B,我们就说类A依赖类B,从编程语言的角度,其实就是引用类B的实例。注入的意思就是,在类A外生成类B的实例,类A直接引用该实例,把主被动态一改,就是将类B的实例注入到类A中。如果不使用依赖注入,类A需要自己维护对B的直接引用(必须是具体的类型而不能是抽象类或接口),也就是要自己初始化一个B的实例。这导致了高度耦合,难以测试。
面向方面编程(AOP)
依赖注入实现了组件的松耦合,而面向方面编程可以使用全系统范围的可重用的组件的功能。
面向方面编程将系统的关注点分离。系统由组件构成,各个组件负责自己的功能。但是有时候,组件也要处理一些非核心功能。像日志、事务管理和安全性这样的功能在各个组件中经常出现,而这些组件的核心功能并不是这些功能。
在多个组件里都关注这些非核心功能(的实现),既使得这些功能的代码重复,又使组件的代码被这些代码污染,显得杂乱。
而面向方面编程可以让组件只关心核心功能,实现高内聚,并且确保POJO保持朴素(plain)。
日志、事务和安全等各个方面(aspect)就像一张张毯子,覆盖在各个组件上,毯子只关心自己的业务,不侵入到组件内部,组件也不用关心毯子的存在。
Spring的两种不同类型的容器实现:
Bean工厂(bean factories,由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持。
应用上下文(application)由org.springframework.context.ApplicationContext接口定义)基于BeanFactory之上构建,并提供面向应用的服务。
Spring自带的三种最有可能碰到的应用上下文:
ClassPathXmlApplicationContext:从类路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当作类资源。
FileSystemXmlapplicationcontext:读取文件系统下的XML配置文件并加载上下文定义。
XmlWebApplicationContext:读取Web应用下的XML配置文件并装载上下文定义。
加载一个FileSystemXmlapplicationcontext:
ApplicationContext context = new FileSystemXmlApplictionContext(“c:/foo.xml”);
类似地,加载一个ClassPathXmlApplicationContext:
ApplicationContext context = new ClassPathXmlApplicationContext(“foo.xml”);
两者区别在于FileSystemXmlApplicationContext在指定的文件系统路径下查找foo.xml文件。
而ClassPathXmlApplicationContext是在所有的类路径(包含jar文件)下查找foo.xml文件。
Spring中Bean的生命周期:
1、Spring对Bean进行实例化。
2、Spring将值和Bean的引用注入进Bean对应的属性中。
3、如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()接口方法。
4、如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()接口方法,将BeanFactory容器实例传入。
5、如果Bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()接口方法,将应用上下文的引用传入。
6、如果Bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()接口方法。
7、如果Bean实现了Initialization接口,Spring将调用它们的afterPropertiesSet()接口方法。类似地,如果Bean使用init-method声明了初始化方法,该方法也会被调用。
8、如果Bean实现了BeanPostProcessor接口,Spring将调用它们的postPoressAfterInitialization()方法。
9、此时,Bean已经准备就绪,可以被使用了,它们将一直驻留在应用上下文中,知道该应用上下文被销毁。
10、如果Bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
Spring模块:
1、核心Spring容器(Core Spring container)
2、Spring的AOP模块
3、数据访问与集成
4、Web和远程调用
5、测试
上一篇: css怎么设置多行超出显示省略号
下一篇: 《Spring实战》第一章读书笔记