欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring第一章读书笔记

程序员文章站 2022-03-27 09:34:59
...

依赖注入

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、测试

相关标签: 笔记 spring