Spring笔记
Spring笔记
Spring提供两种容器类型:BeanFactory和ApplicationContext。
BeanFactory:
适用场景: 资源有限,并且功能要求不是很严格的场景。
为什么适用这个场景?默认采用 延迟初始化策略(lazy-load)。只有当客户端对象需要访问容器中的某个受管对象的时候,才对 该受管对象进行初始化以及依赖注入操作。
ApplicationContext:
适用场景:系统资源充足,并且要求更多的功能时候,选择这种容器。
更高级,拥有BeanFactory的所有支持。ApplicationContext所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成。所以这种容器要求更多的资源。
作为Spring提供的基本的IoC容器, BeanFactory可以完成作为IoCServiceProvider的所有职责,包括业务对象的注册和对象间依赖关系的 绑定。
拥有BeanFactory之后的生活:
之前我们的系统业务对象需要自己去“拉”(Pull)所依赖的业务对象, 有了BeanFactory之类的IoC容器之后,需要依赖什么让BeanFactory为我们推过来(Push)就行了。
BeanFactory的对象注册与依赖绑定方式:
主流的就是采用注解方式
BeanFactory的XML的管理方式:
XML格式的容器信息管理方式是Spring提供的最为强大、支持最为全面的方式。
统一的XMLXML格式:
在Spring 2.0版本之前,这种格式由 Spring提供的DTD 规定,也就是说,所有的Spring容器加载的XML配置文件的头部,都需要以下形式的DOCTYPE声明:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" ➥ "http://www.springframework.org/dtd/spring-beans.dtd"> <beans>
... </beans>
从Spring 2.0版本之后,Spring在继续保持向前兼容的前提下,既可以继续使用DTD方式的DOCTYPE 进行配置文件格式的限定,又引入了 基于XML Schema的文档 声明。
xml元素介绍:
-
<beans>之唯我独尊
<beans>是XML配置文件中最顶层的元素,它下面可以包含0或者1个<description>和多个
<bean>以及<import>或者<alias>。
<beans>拥有相应的属性(attribute)对所辖的进行统一 的默认行为设置:
- default-lazy-init。其值可以指定为true或者false,默认值为false。用来标志是否对所 有的
进行延迟初始化。 - default-autowire。可以取值为no、byName、byType、constructor以及autodetect。默 认值为no,如果使用自动绑定的话,用来标志全体bean使用哪一种默认绑定方式。
- default-dependency-check。可以取值none、objects、simple以及all,默认值为none, 即不做依赖检查。
- default-init-method。如果所管辖的
按照某种规则,都有同样名称的初始化方法的 话,可以在这里统一指定这个初始化方法名,而不用在每一个 上都重复单独指定。 - default-destroy-method。与default-init-method相对应,如果所管辖的bean有按照某种
规则使用了相同名称的对象销毁方法,可以通过这个属性统一指定。
-
<description>
通常情况下,该元素是省略的。
-
<import>
比如,如果A.xml中的
定义可能依赖 B.xml中的某些 定义,那么就可以在A.xml中使用 将B.xml引入到A.xml,以类似于 的形式。 -
<alias>
<beans>的属性:
?????
<beans>的scope:
scope用来声明容器中的对象所应该处的限定场景或者说该对象的存活时间,即容器在对象进入其 相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象。
Spring容器最初提供了两种bean的scope类型:singleton和prototype,但发布2.0之后,又引入了另 外三种scope类型,即request、session和global session类型。不过这三种类型有所限制,只能在Web应 用中使用。也就是说,只有在支持W eb应用的ApplicationContext中使用这三个scope才是合理的。
singleton类型bean定义,从容器启动,到它第一次被请求而实例化开始,只要容器不销毁或者退出,该类型bean的单一实例就会一直存活。
Spring基于注解的依赖注入:
@Autowired注解:按照类型进行匹配的,byType
@Qualifier注解:实际上是byName自动绑定的注解版
使用JSR250标注注解依赖关系:三个注解,@Resource、@PostConstruct、@PreDestory,其中,@Resource遵循的是byName自动绑定形式的行为准则。如果想某个方法在对象实例化之后被调用,以做某些准备工作,或者想在对象销毁之前调用某个 方法清理某些资源,那么就可以像我们这样,使用@PostConstruct和@PreDestroy来标注这些方法。
使用注解来表达对象之间的依赖注入关系!!
配置项:context:annotation-config
不管是@Autowired还是@Resource都需要添加相应的BeanPostProcessor到容器,那么我们 就可以在基于XSD的配置文件中使用一个<context:annotation-config>配置搞定以上所有的 BeanPostProcessor配置。<context:annotation-config> 不 但 帮 我 们 把 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor注册到容器,同时还会把PersistenceAnnotationBeanPost- Processor和RequiredAnnotationBeanPostProcessor一并进行注册
classpath-sacnning功能介绍:
1. 解决的问题:有了注解可以不用在配置文件中明确指定依赖关系,但还是需要将相应对象的bean定义,一个个添加到ioc容器的配置文件中。
2. classpath-scanning功能可以从某一顶层 包(base package)开始扫描。当扫描到某个类标注了相应的注解之后,就会提取该类的相关信息,构 建对应的BeanDefinition,然后把构建完的BeanDefinition注册到容器。
3. classpath-scanning功能的触发是由<context:component-scan>决定的
4. <context:component-scan>默认扫描的注解类型是@Component。不过,在@Component语义基 础上细化后的@Repository、@Service和@Controller也同样可以获得<context:component-scan> 的青睐。