Spring框架的两个核心功能:
- Spring容器作为超级大工厂,负责创建,管理所有的Java对象,这些对象被称为Bean。
- Spring容器管理容器中Bean之间的依赖关系,
Spring使用一种被称为“依赖注入”的方式来管理Bean之间的依赖关系。
-
Spring容器常用接口
-
ApplicationContext
:BeanFactory
的子接口,该接口的实现类:ClassPathXmlApplicationContext
:用于搜索加载类路径下的配置文件FileSystemXmlApplicationContext
:用于搜索加载相对路径或绝对路径下的配置文件
-
-
Spring的核心机制:依赖注入
-
A对象调用B对象被Spring称为
依赖
,即A对象依赖
B对象。假如A组件调用了B组件的方法,即可称A组件依赖
B组件。 -
Ioc控制反转:调用者
主动
获取被依赖对象变为被动
接受Spring容器为调用者的成员变量赋值(依赖注入)。-
设值注入
:IoC容器使用成员变量的setter
方法来注入被依赖对象。- Spring
<bean />
的子元素<property />
- 用于执行JavaBean的
setter
方法 name
:用于执行哪一个setter
方法value
或ref
:用于传入setter
方法的参数。value
用于传入基本数据类型及其包装类,ref
用于传入其他Bean
。
- Spring
-
构造注入
:IoC容器使用构造器来注入被依赖对象。- Spring
<bean />
的子元素<constructor-arg />
index
:用于指定作为第几个构造参数type
:用于指定构造参数的类型value
或ref
:用于传入构造器的参数。value
用于传入基本数据类型及其包装类,ref
用于传入其他Bean
。
- Spring
-
-
ApplicationContext
的国际化
支持ApplicationContext
接口继承了MessageSource
接口,因此具有国际化功能。String getMessage(String code, Object[] args, Locale loc)
String getMessage(String code, Object[] args, String default, Locale loc)
-
ApplicationContext
的事件机制-
ApplicationEvent
:容器事件,必须由ApplicationContext
发布publishEvent()
:发布容器事件
-
ApplicationListener
:监听器,可由容器中的任意监听器Bean担任。
-
-
-
Spring 容器中的Bean
-
Bean的基本定义和Bean别名
id
:确定该Bean的唯一标示,如果Bean的标识必须包含一些特殊符号,此时可以采用name
属性,用于指定Bean的别名。通过访问Bean别名也可以访问Bean实例。class
:指定该Bean的具体实现类,这里不能是接口 。<alias name="" alias="" />
指定别名
-
容器中Bean的作用域(scope)
singleton
:单例模式。singleton作用域内的Bean将只生成一个实例。prototype
:每次通过getBean()
获取prototype作用域内的Bean时,都将生成一个新的Bean实例。request
:对于一次HTTP请求,只生成一个实例。session
:对于一次HTTP回话,只生成一个实例。application
:对于整个Web应用,只生成一个实例。websocket
:在整个WebSocket的通信过程中,只生成一个实例。
-
使用自动装配注入合作者Bean
-
<beans .../>
元素的default-autowire
属性指定,所有的Bean起作用。 -
<bean .../>
元素的autowire
属性指定,只对该Bean起作用。 -
autowire
、default-autowire
属性可以接收如下值:no
:不使用自动装配。必须通过ref
元素定义。byName
:根据setter
方法名与Bean的id
进行匹配。byType
:根据setter
方法的形参类型来自动装配。
-
-
Spring提供的Java配置管理(注解)
@Configuration
:用于修饰一个Java类@Bean
:用于修饰一个方法,将该方法的返回值定义成一个Bean@Value
:用于修饰一个Field,用于为该Field配置一个值,相当于配置一个变量。- 使用
AnnotationConfigApplicationContext(AppConfig.class)
创建Spring容器。 <bean class="AppConfig" />
加载配置类@ImportResource("classpath:/beans.xml")
加载配置文件
-
创建Bean的3种方式
- 调用构造器创建Bean
- 调用静态工厂方法创建Bean
- 调用实例工厂方法创建Bean
-
获得Bean本身的
id
- 通过实现
BeanNameAware
接口的setBeanName()
方法
- 通过实现
-
-
容器中Bean的生命周期
-
注入依赖关系之后
- 使用
init-method
属性 - 实现
InitialzingBean
接口
- 使用
-
即将销毁Bean之前
- 使用
destory-method
属性 - 实现
DisposableBean
接口
- 使用
-
协调作用域不同步的Bean
<lookup-method name="" bean="" />
-
-
高级依赖关系配置
-
获取其他Bean的属性值
-
PropertyPathFactoryBean
调用其他Bean的getter
方法:-
调用哪个对象:
setTargetObject(Object targetObject)
-
调用哪个
getter
方法:setPropertyPath(String propertyPath)
-
<util:property-path.../>
简化配置:id
:指定将getter
方法的返回值定义成名为id
的Bean实例。path
:指定哪个Bean实例,哪个属性暴漏出来。
-
-
-
FieldRetrievingFactoryBean
获取Field值 -
MethodInvokingFactoryBean
获取方法返回值
-
-
基于XML Schema的简化配置方式
- 使用
p:
命名空间来驱动执行setter
方法 (设值注入) - 使用
c:
命名控件来驱动执行构造器方法 (构造注入) util:
命名空间简化constant
,property-path
、list
,set
,map
,properties
aop:
命名空间简化Spring AOPjee:
简化Spring的Java EE配置jms:
简化Spring关于JMS的配置lang:
简化Spring动态语言tx:
简化Spring事务配置
- 使用
-
Spring提供的表达式语言(SpEL)