Spring笔记



什么是Spring?


Spring是一个开源框架
Spring为简化企业级应用开发而生,使用Spring可以使简单的Javabean实现以前只有EJB才能实现的功能
Spring是一个IOC(DI)和AOP容器框架


具体描述Spring:
--轻量级 :Spring是非侵入式的,基于Spring开发的应用中的对象可以不依赖Spring的API
--依赖注入(DI、IOC)
--面向切面编程(AOP)
--容器,Spring是一个容器
--框架,Spring实现了简单的组件配置组合成一个复杂的应用,在Spring中可以使用xml和java注解组合这些对象。
--一站式,在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库


IOC和DI概述:

IOC(Inversion of Control),反转资源获取的方向,传统资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时
地返回资源;而应用了IOC之后,则是容器主动地将资源推送给它所管理的组件,组件所要做的仅是
选择一种合适的方式来接受资源,这种行为也被称为查找的被动形式。

DI(Dependency Injection),IOC的另一种表述方式,即组件以一些预先定义好的方式(例如setter方法)接受来自
如容器的资源注入,相对于IOC而言,这种表述更直接。


配置bean: 
class: bean的全类名,通过反射的方式在IOC容器中创建bean,所以要求bean必须有无参数的构造器。
id: 标识容器中的bean,id唯一。

在Spring IOC容器对去bean配置创建bean实例之前,必须对它进行实例化,只有在容器实例化后,才可以从IOC容器里获取bean实例并使用。
Spring提供了两种类型的IOC容器实现:
--BeanFactory :IOC容器的基本实现
--ApplicationContext:提供更多的高级属性,是BeanFactory的子接口。
--BeanFactory是Spring框架的基础设施,面向Spring本身;
ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都直接使用ApplicationContext而非底层的BeanFactory.
--无论使用何种方式,配置文件时相同的。


ApplicationContext的主要实现类:
--ClassPathXmlApplicationContext :从类路径下加载配置文件
--FileSystemXmlApplicationContext:从文件系统中加载配置文件

ConfigurableApplicationContext扩展于ApplicationContext,新增两个主要方法refresh()和close()。
ApplicationContext在初始化上下文时就实例化所有单例的bean。
WebApplicationContext是专门为web应用而准备的,它允许从相对于web根目录的路径中完成初始化工作。



依赖注入的方式:
--属性注入
即通过setter方法注入bean的属性值或依赖的对象
属性注入使用<property>元素,使用name属性指定bean的属性名称,value指定属性值。
属性注入是实际应用中最常用的注入方式

--构造器注入
通过构造方法注入bean的属性值或依赖对象,它保证了bean实例在实例化后就可以使用
构造器注入在<constructor-arg>元素里声明属性,它没有name属性。

--工厂方法注入(不推荐)

注入属性值细节:
--自动转配
==bean之间的关系:继承,依赖
--bean的作用域:singleton,prototype,web环境作用域
--使用外部属性文件
--spEL
--IOC容器中bean的生命周期
--Spring 4.x新特性:泛型依赖注入

字面值:可用字符串表示的值,可以通过<value>元素标签或value属性进行注入
基本数据类型及其封装类、Spring等类型可以采取字面值注入的方式
若字面值中包含特殊字符,可以使用<![CDATA[]]]>把字面值包裹起来

Bean之间的引用:要使bean之间能够互相访问,就必须在bean配置文件中指定对bean的引用,
在bean的配置文件中可以通过<ref>元素或ref属性为bean的属性或构造器参数指定对bean的引用。
也可以在属性或构造器里包含bean的声明,这样的bean称为内部bean。


注入参数详解;null值和级联属性
可以使用专用的<null/>元素标签为bean的字符串或其它对象类型的属性注入null值
和Struts、hibernate等框架一样,Spring支持级联属性的配置。


集合属性;在Spring中可以通过一组内置的xml标签(如<list>,<set>,<map>)来配置集合属性。
配置java.util.List类型的属性,需要制定<list>标签,在标签里包含一些元素,这些标签可以通过
<value>制定简单的常量值,通过<ref>指定其他bean的引用,通过<bean>指定内置bean定义,通过<null/>
指定空元素,甚至可以内嵌其他集合。
数组的定义和List一样,都使用<list>
配置java.util.Set需要使用<set>标签,定义元素的方法与List一样。

java.utilMap通过<map>标签定义,<map>标签可以使用多个<entry>作为子标签,每个条目包含一个个键和一个值。
必须在<key>标签里定义键。
因为键和值的类型没有限制,所以可以自由地为他们指定<value>,<ref>,<bean>或<null/>元素。
可以将Map的键和值作为<entry>的属性定义:简单常量使用key和value来定义,bean引用通过key-ref和value-ref属性定义。
使用<props>定义java.util.properties,该标签使用多个<prop>作为子标签,每个<prop>必须定义key属性。


使用utility scheme定义集合:
使用基本的集合标签定义集合时,不能将集合作为独立的bean定义,导致其他bean无法
引用该集合,所以无法再不同bean之间共享集合。
可以使用util schema 里的集合标签定义独立的集合bean,注意必须在<beans>根元素里添加util schema定义。

使用p命名空间:
为了简化文件的配置,越来越多的XML文件采用属性而非子元素配置信息。
Spring 2.5版本开始引入了一个新的p命名空间,可以通过<bean>元素属性的方式配置bean属性。
使用p命名空间后,基于mxl的配置方式将进一步简化。



XML配置里的bean自动装配:
Spring IOC容器可以自动装配bean,需要做的仅仅是在<bean>的autowire属性里指定自动装配的模式。
byType(根据类型自动装配):若IOC容器中有多个与目标bean类型一致的bean,Spring将无法判定哪个bean最适合该属性,所以不能执行自动装配。
byName(根据名称自动装配):必须将目标bean的名称和属性设置的完全不同。
constructor(通过构造器自动装配):当bean中存在多个构造器时,此种自动装配方式将会很复杂,不推荐使用。


继承bean配置:
Spring 允许继承bean配置,被继承的bean成为父bean,继承这个bean的成为子bean。
子bean从父bean中继承配置,包括bean的属性配置。
子bean也可以覆盖从父bean继承过来的配置。
父bean可以作为配置模板,也可以作为bean的实例,若只想把父bean作为模板,可以设置<bean>的abstract属性为true,这样Spring将不会实例化这个bean。
并不是<bean> 元素里的所欲属性都会被继承,比如:autowire,abstract等
也可以忽略父bean的class属性,让子bean指定自己的类,而共享相同的属性配置,但此时abstract必须设为true。



依赖bean配置:
Spring允许用户通过depends-on属性设定bean前置依赖的bean,前置依赖的bean会在本bean实例化之前创建好。
如果设置依赖多个bean,则可以通过逗号,空格的方式配置bean的名称。



使用bean的scope属性来配置bean的作用域:
singleton:默认值,容器初始创建bean实例,在整个容器的声明周期内只创建这一个bean,单例的。
prototype:原型的,容器初始化时不创建bean的实例,而在每次请求时都创建一个新的bean实例,并返回。




使用外部属性文件:
在配置文件配置bean时,有时需要在bean的配置文件里混入系统部署的细节信息(如文件路径、数据源配置信息等),
而这些部署细节实际上需要和bean配置分离。

Spring提供了一个PropertyPlaceholderConfigurer的BeanFactory后置处理器,这个处理器允许用户将bean配置的
部分内容移到属性文件中,可以在bean配置文件里使用形式为${var}的变量,ProopertyPlaceholderConfigurer从
属性文件里加载属性,并使用这些属性来替换变量。

Spring还允许在属性文件中使用${propName},以实现属性之间的相互引用。



Spring表达式语言:SpEL
Spring表达式语言是一个支持运行时查询和操作对象的强大的表达式语言。
语法类似于EL,SpEL使用#{...}作为定界符,所有在大括号中的字符都将被认为是SpEL.

SpEL为bean的属性进行动态赋值提供便利。

通过SpEL可以实现:--通过bean的id对bean进行引用
 --调用方法以及引用对象中的属性
 --计算表达式的值
 --正则表达式的匹配
 
SpEL字面量:
字面量的表示:
--整数:<property name="count" value="#{4}"/>
--小数:<property name="frequency" value="#{4.44}"/>
--科学计数法:<property name="capacity" value="#{1e4}"/>
--String可以使用单引号或双引号作为字符串的定界符号:
<property name="name" value="#{'Chuck'}"/>或<property name="name" value="#{"Chuck”}"/>
--Boolean:  <property name="enabled" value="#{false}"/>

SpEL:引用bean、属性和方法:
调用静态方法或静态属性:通过T()调用一个类的静态方法,他将返回一个Class Object,
然后再调用相应的方法或属性:<property name="initValue" value="#{T(java.lang.Math).PI}"/>



IOC容器中bean的生命周期方法:
SpringIOC容器可以管理bean的生命周期,Spring允许在bean生命周期的特定点执行定制的任务。

SpringIOC容器对bean的生命周期进行管理的过程:
--通过构造器或工厂方法创建bean实例
--为bean属性设置值和对其他bean的引用
--调用bean的初始化方法
--bean可以使用了
--当容器关闭时,调用bean的销毁方法

在bean的声明里设置init-method和destory-method属性,为bean指定初始化和销毁方法。


创建bean后置处理器:
bean后置处理器允许在调用初始化方法前后对bean进行额外的处理。
bean后置处理器对IOC容器里的所有bean实例逐一处理,而非单一实例,其典型应用是:检查bean属性
的正确性或根据特定的标准更改bean的属性。
对bean的后置处理器而言,需要实现interface BeanPostProcessor接口,在初始化方法被调用前后,
Spring将把每个bean实例分别传递给上述接口的两个方法:
--public Object postProcessBeforeInitialization(Object bean,String beanName)
   --public Object postProcessAfterInitialization(Object bean,String beanName)




通过调用静态工厂方法来配置Bean,注意不是配置静态工厂方法实例,而是配置bean实例:
--class属性:指向静态工厂方法的全类名
--factory-method:指向静态工厂方法的名字
--constructor-arg:如果工厂方法需要传入参数,使用从constructor-arg来配置参数



通过调用实例工厂方法创建bean:
实例工厂方法:将对象的创建过程封装到另外一个对象实例的方法里。当客户端需要请求对象时,
只需要简单的调用该实例方法而不需要关心对象的创建细节。

要声明通过实例工厂方法创建的实例bean--在bean的factory-bean属性里指定拥有该工厂方法的bean
--在factory-method属性里指定该工厂方法的名称
--使用construtor-arg元素为工厂方法传递方法参数



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值