Spring笔记将spring进行到底DOC.docx
- 文档编号:7390823
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:38
- 大小:35.21KB
Spring笔记将spring进行到底DOC.docx
《Spring笔记将spring进行到底DOC.docx》由会员分享,可在线阅读,更多相关《Spring笔记将spring进行到底DOC.docx(38页珍藏版)》请在冰豆网上搜索。
Spring笔记将spring进行到底DOC
chapter01Spring简介
一、Spring是什么?
业务层框架的动机--快速构建Java企业应用,框架简化开发过程,提供公共服务和便利的工具
1)使组件松散耦合,组件依赖可配置
2)提供公共服务:
比如事务、安全
3)简化使用j2ee的技术
在了解Spring之前,我们来了解在JavaEE框架下企业级开发采用EJB框架的一些不足:
(1)EJB太笨重,而且EntityEJB不能脱离容器
(2)企业级服务使用困难
(3)开发的复杂度太高
(4)侵入式方案,EJB要使用特定的接口
因此,Spring应运而生。
3Spring的3个核心特性
IOC---Inverseofcontrol
使得业务组件都处在框架的管理之下
框架可以管理组件的创建和依赖关系
框架可以提供可以配置的服务
AOP
AspectOreintedProgramming
在不修改组件的前提下,为组件提供扩展的服务
简化对j2ee技术的使用
更方便的使用j2ee的技术jdbc/orm/struts
Spring是一个开源的用于简化采用Java语言开发企业级程序的一个分层的框架。
关于程序的分层结构:
1、Presentationlayer(表示层)
(1)表示逻辑(生成界面代码)
(2)接收请求
(3)处理业务层抛出的异常
(4)负责规则验证(数据格式,数据非空等)
(5)流程控制
2、Servicelayer(服务层/业务层)
(1)封装业务逻辑处理,并且对外暴露接口
(2)负责事务,安全等服务
3、Persistencelayer(持久层)
(1)封装数据访问的逻辑,暴露接口
(2)提供方便的数据访问的方案(查询语言,API,映射机制等)
Domainlayer(域层)
(1)业务对象以及业务关系的表示
(2)处理简单的业务逻辑
(3)域层的对象可以穿越表示层,业务层,持久层
二、Spring的作用
为什么要使用Spring?
(1)简化企业级开发
①封装了大部分的企业级服务,提供了更好的访问这些服务的方式
②提供了IOC,AOP功能的容器,方便编程
(2)遵循Spring框架的应用程序,一定是设计良好的,针对接口编程,这样就简化了企业级程序的设计。
(3)Spring的组成
①SpringCore:
核心容器,BeanFactory提供了组件生命周期的管理,组件的创建,装配,销毁等功能
SpringContext:
ApplicationContext,扩展核心容器,提供事件处理、国际化等功能。
它提供了一些企业级服务的功能,提供了JNDI,EJB,RMI的支持。
②SpringAOP:
提供切面支持
③SpringDAO:
提供事务支持,JDBC,DAO支持
④SpringORM:
对流行的O/RMapping封装或支持
⑤SpringWeb:
提供Web应用上下文,对Web开发提供功能上的支持,如请求,表单,异常等。
⑥SpringWebMVC:
全功能MVC框架,作用等同于Struts。
chapter02Spring的IoC
一、IoC的概念
IoC,InversionofControl,控制反转。
对象的协作关系由对象自己负责。
依赖注入:
对象的协作关系由容器来建立。
二、IoC的类型
(1)基于特定接口(侵入式方案)
(2)基于set方法
(3)基于构造器
三、Spring容器
Spring容器负责生成、组装、销毁组件,并负责事件处理、国际化等功能。
(1)BeanFactory
①核心容器,负责组件生成和装配
②实现主要包括XmlBeanFactory
(2)ApplicationContext
(3)WebApplicationContext
(4)……
四、IoC的使用
Resource:
interface,用来包装资源
implements:
ClassPathResource在类路径下查找资源
另有FileSystemResource
xmlBeanFactory:
BeanFactory的一个实现,使用Resource对象来查找配置文件
BeanFactory.gerBean(“BeanId”):
取得以参数命名,或者Id等于参数值的一个Bean实例。
BeanFactory(容器)在默认情况下,会采用单例方式返回对象。
容器只到调用getBean方法时,才会实例化某个对象。
(1)Spring可以采用XML或者.properties文件作配置
(2)配置文件(XML)
根元素
五、bean的创建,通过构造方法和工厂创建
(1)通过构造方法:
consctructor注入
无参的构造方法
有参的构造方法,需指明构造方法的参数列表,通过:
如果Bean属性不多,并且属性值必须要注入才能使用,则应该采用constructor注入,其他情况就要set方法注入。
(2).通过工厂方法获得bean对象
bean没有公共的构造方法,需通过工厂类或工厂实例来创建
分为静态工厂和实例工厂方法两种情况
<1>.实例工厂配置
代码:
--------------------------------------------------------------------------------
//方法参数的处理
//先创建工厂实例
--------------------------------------------------------------------------------
<2>.静态工厂配置
<3>.单例bean
bean工厂生产bean缺省都是单例的
scope属性
scope="singleton|prototype|request|session"
后两者用于web应用中
六、依赖注入
1、构造方法注入2、setter注入3、接口注入(有侵入性)
1、setter注入
(1)注入简单属性(String和8中基本类型)
对于基本类型,Spring容器会自动作类型转换,以便赋值。
(2)注入对象
A、让Spring容器在当前配置文件中找到相应的Bean,并调用set方法,注入该Bean。
B、将一个Bean的定义嵌套在另一个Bean中(可读性差),被嵌套的Bean不能采用getBean()返回
C、采用
(3)注入集合类型
①Set
Set中存放字符串,对象,集合,不允许重复
②List(数组也用它了)
List中可以放入字符串,对象,List
与Set一样
③Map
Map有
④Properties
Properties有
2、构造方法注入:
见前面bean的创建(构造方法)
3、spring直接利用了bean的set或构造方法,避免了使用接口注入的侵入性
七、解决依赖注入的遗留关系
1、装配关系检查(Dependencychecking)
让容器检测bean所有的依赖是否都已经满足,某个bean需要设置好所有属性,防止遗漏装配,在运行后出现莫名奇妙的情况
simple:
检查简单类型,String和集合
ojects:
检查对象类型,对其他对象的依赖
all:
检查所有
none:
默认值
2、装配方式:
<1>、自动装配(AutowringProperties)
装配方式:
byName,byType,autodetect,constructor
autowire=“byName”:
按照名称匹配
按照Bean的Id与属性的名称进行匹配
autowire=“byType”:
按照类型匹配
要注入的属性类型与配置文件中的Bean类型匹配的个数超过一个,会出错。
autowire=“antodetect”:
先按照construct,后按照byType。
autowire=“constructor”:
先去匹配构造器中参数类型,后与配置文件中的Bean类型匹配。
autowire-candidate属性
指明是否作为autowire的候选对象,解决多个候选对象的冲突
autowire-candidate="true"
autowire-candidate="false"
<2>、自动装配与手动装配可以结合使用,手动装配会覆盖自动装配。
<3>、比较两种注入方式
关于自动匹配:
优点:
快速开发
缺点:
依赖关系不清楚,易出错,不易维护。
自动匹配的应用场合:
(1)构建系统原型
(2)与依赖关系检查(Dependency-check)结合使用
(3)自动装配与手动装配结合
3、管理Bean生命周期
生命周期
<1>、构造
<2>、set
<3>、回调初始化方法
<4>、getBean返回
回调方法:
两个属性指明
init-method
destroy-method
或实现两个接口:
(框架的侵入性)
InitiallizingBean
DisposableBean
4、重用bean定义
parent--继承bean定义
bean之间不一定有继承关系
abstract---只作为模板,不可以被实例化,不作为bean使用
其子类bean继承其定义并且被应用
5、延迟加载bean
bean的加载时机
预先加载:
构造bean工厂时实例化所有bean
延迟加载:
getBean时构造,先构造依赖的bean
BeanFactory总是延迟加载的
ApplicationContext,BeanFactory的扩展
预先加载单例bean,lazy-init(true|false)
6、补充:
name代替id:
取名要求比较宽泛,一个bean可定义多个name,空格或逗号隔开
id=""//取名要求比较严格,不能有特殊字符
name="/myBean"
name="abc"//3个名字
有业务相关的成员变量才考虑多线程并发访问的安全问题
7、在bean中获得工厂
引入接口:
BeanFactoryAware
ApplicationContextAware
工厂通常对bean是透明的(即bena并不最大beanFactory的存在)
某些时候bean需要知道工厂(获得工厂的引用),并不可避免的引入侵入性
implementsBeanFactoryAware
setBeanFactory(BeanFactorybf){
this.bf=bf;
}
八、ApplicationContext
是对BeanFactory的扩展,为应用提供事件框架和国际化的支持,预先实例化所有单例bean:
在实际过程中我们,优先选择ApplicationContext
1、特殊的IoC
①后处理Bean
接口:
org.springframework.beans.factory.config.BeanPostProcessor
允许在bean在构造好后做附加的处理,没有类的源代码改变类的属性
Spring已经实现该接口的BeanPostProcessor(不用再注册)
ApplicationContextAwareProcessor:
把应用上下文传递给所用实现了ApplicationContextAware接口的Bean
ApplicationContextAware接口使用举例,可参照事件监听机制
DefaultAdvisorAutoProxyCreator自动对Bean应用切面
1)实施BeanPostProcessor:
(1).publicclassUserModelUpdateimplementsBeanPostProcessor{
publicObjectpostProcessAfterInitialization(Objectbean,StringbeanId)
throwsBeansException{
if(beaninstanceofUserModel){
UserModelmodel=(UserModel)bean;
model.setName(model.getName().toUpperCase());
}
returnbean;
}
publicObjectpostProcessBeforeInitialization(Objectarg0,Stringarg1)
throwsBeansException{
returnarg0;
}
}
(2).beans.xml中声明UserModelUpdate
②Bean工厂后处理接口:
(只能在应用上下文中使用)org.springframework.beans.factory.config.BeanFactoryPostProcessor
Bean工厂的plug-in
可以在用户使用bean工厂前完成某些设置
通常不需要扩展,spring提供了几个实现
CustomEditorConfigurer对属性编辑器的支持
PropertyPlaceHolderConfigurer让applictioncontext在属性文件中读取某些配置
PropertyOverrideConfigurer在属性文件中配置属性覆盖beans.xml中的属性值
1)对属性编辑器的支持
属性编辑器可以把字符串转换为期望的类型
实施:
(1).定义属性编辑器,包装转换规则
AddressEditorextendsPropertyEditorSupport{
publicvoidsetAsText(Stringtext){}//包装转换规则,得到对象
publicObjectgetValue(){};//返回对象
}
(2)把属性编辑器注册给applictioncontext
2)让applictioncontext在属性文件中读取某些配置
实施:
(1).属性文件wxl/spring/resource/config.properties
(2).引用属性文件的属性
(3).注册属性文件
3)在属性文件中配置属性覆盖beans.xml中的属性值
实施:
(1).注册属性文件
--从配置文件中修改属性配置-->
(2)在属性文件中,按以下规则覆盖属性
beanid.beanpropername=newvalue
2、事件处理
事件监听提供了一个观察者模式的框架,快速实现组件间的事件通知
实施:
1)自定义事件,通过继承org.springframework.context.ApplicationEvent
2)所有想得到通知的对象都自定义监听器,
实现org.springframework.context.ApplicationListener,并注册
3)发布事件,为得到应用上下文,
必须实现org.springframework.context.ApplicationContextAware接口
事件源发出事件:
applicationContext.publishEvent(event);
自定义事件类
什么时候需要?
被观察者在需要传输数据给观察者时
怎么做?
自定义事件类通过继承org.springframework.context.ApplicationEvent
3、国际化的支持(I18N)
ApplicationContext可以读取国际化的消息文件
getMessage();
实施:
1)注册消息源
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Spring 笔记 进行到底 DOC