spring学习心得.docx
- 文档编号:28981950
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:16
- 大小:3.13MB
spring学习心得.docx
《spring学习心得.docx》由会员分享,可在线阅读,更多相关《spring学习心得.docx(16页珍藏版)》请在冰豆网上搜索。
spring学习心得
控制反转(IoC):
spring容器根据配置文件信息,负责创建某类实例,并为实例设置属性值——这种由spring容器为对象设置属性的方式被称为控制反转
Spring的核心机制:
依赖注入
当某个java实例需要其他java实例时,系统自动提供所需要的实例,无需程序显式获取
使用依赖注入不仅可以为Bean注入普通的属性值,还可以注入其他Bean的引用
所谓依赖注入,就是在在运行期间,有外部容器动态地将依赖对象注入到组件中(构造方法和set方法)
不管是控制反转还是依赖注入,其含义完全相同:
当某个java实例(调用者)需要另一个java实例(被调用者)时,在传统的程序设计过程中,在传统的程序设计当中,通常由调用者来创建被调用者的实例
在依赖注入的模式下,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常是由spring容器来完成,然后注入调用者,因此也称为依赖注入
依赖注入通常有两种:
1)设值注入:
设值注入是指IoC容器使用属性的setter方法来注入被依赖的实例
2)构造注入:
这种利用构造器来设置依赖关系的方式,被称为构造注入
两种注入方式的区别:
创建Person实例中Axe属性的时机不同——设值注入是先通过无参数的构造器创建一个bean实例,然后调用对应的setter方法注入依赖关系;而构造注入则直接调用有参数的构造器,当bean实例创建完成后,已经完成了依赖关系的注入
Spring提供的服务
1)事物管理服务
2)JMS服务(Java消息服务是基于java的消息中间件、是javaEE的一部分、用于在多个Java应用之间发送消息、该机制使得多个分布式应用可以异步通信、提高软件可靠性、降低耦合度)
3)Springcore核心服务
4)持久化服务
ApplicationContext事件机制:
Spring的事件机制与所有的事件机制都基本相似,它们都需要事件源、事件、事件监听器,此处的事件源是ApplicationContext,且事件必须有java程序显式触发
Spring事件框架有两个重要成员:
1)ApplicationEvent:
容器事件,必须由ApplicationContext发布
2)ApplicationListener:
监听器,可由容器中的任何监听器bean担任
通过ApplicationEvent类和ApplicationListener接口,可实现ApplicationContext的事件处理
如果容器中有一个ApplicationListenerBean,每当ApplicationContext发布ApplicationEvent时,ApplicationListenerBean将自动被触发
在默认情况下,当spring创建ApplicationContext容器时,Spring会自动预初始化容器中所有的singleton实例,如果我们不想让Spring容器预初始化某个singletonBean,则可为该
容器中Bean的作用域
当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的
作用域,Spring支持如下的5种作用域
1)singleton:
单例模式,在整个SpringIoC容器中,使用singleton定义的Bean将只有一个实例
2)prototype:
原型模式,每次通过容器的getBean方法获取prototype定义的Beans时,都将产生一个新的Bean实例
3)request:
对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求都将会产生不同的Bean实例。
只有在web应用中使用Spring时,该作用域才真正有效
4)session:
对于每次HTTPSession,使用session定义的Bean都将产生一个新实例,即每次HTTPSession都将产生不同的Bean实例。
只有在web应用中使用Spring时,该作用域才真正有效
5)globalsession:
每个全局的HTTPSession对应一个Bean实例。
典型情况下,仅在使用portletcontext的时候有效,只有在web应用中使用Spring时,该作用域才真正有效
注意:
如果不指定Bean的作用域,则Spring默认使用singleton作用域
设置Bean的作用域,使用scope属性
例子:
Session作用域与request作用域完全相似,区别在于:
request作用域的Bean对于每次HTTP请求有效,而session作用域的Bean则对于每次HTTPSession有效,它们都是在web应用中才有效,并且必须在web应用中增加额外的配置才有效,我们需要有两种配置方式:
采用Listener配置或者Filter配置,我们可以在web.xml文件中增加如下Listener配置
如果使用了只支持Servlet2.4以前规范的的web容器,则该容器不支持Listener规范,故无法使用这种配置方式,只能使用Filter配置
使用自动装配注入合作者Bean:
使用autowire属性设置自动装配,autowire属性可接受如下值:
(注入依赖关系的方式)
1)no:
不使用自动装配。
Bean依赖必须通过ref元素定义,这是默认的配置,在较大的部署环境中不鼓励改变这个配置,显式配置合作者能够得到更清晰的依赖关系
2)byName规则是通过名字注入依赖关系
3)
4)
5)
组合属性名称:
三种获取ApplicationContext对象引用的方法
1.ClassPathXmlApplicationContext通过类路径。
2.FileSystemXmlApplicationContext通过文件路径。
ApplicationContextac=FileSystemXmlApplicationContext("d:
\\com\\bean.xml");
3.XmlWebApplicationContext:
从web系统中加载
ApplicationContext继承了BeanFactory接口,所以,ApplicationContext也能像BeanFactory从容器中得到Bean;
注入嵌套Bean
如果某个Bean所依赖的Bean不想被Spring容器直接访问,可以使用嵌套Bean,
例子:
注入集合值:
例子:
--为List属性提供属性值-->
--每个value、ref、bean都配置一个List元素-->
--为Map属性配置属性值-->
--为为每个entry配置一个key-value对-->
--为Map属性配置属性值-->
--为每个entry配置一个key-value对-->
--为每个properties属性配置属性值-->
--为每个prop元素配置一个属性项,其中key指定属性名-->
--为Set属性配置属性值-->
--每个value、ref、bean都配置一个Set元素-->
--为数组属性配置属性值-->
--每个value、ref、bean都配置一个数组元素-->
Spring中的Bean满足的原则以及Bean与JavaBean的区别:
原则:
1)尽量为每个Bean实现类提供无参数的构造器
2)接受构造注入的Bean,则应提供对应的构造函数
3)接受设置注入的Bean,则应提供对应的setter方法,并不强制提供对应的getter方法
区别:
1)用处不同:
传统JavaBean更多作为值对象传递参数;Spring的Bean作用几乎无所不包,任何应用组件都被称为Bean
2)写法不同:
传统JavaBean作为值对象,要求每个属性都提供getter和setter方法,但Spring的Bean只需为接受设置注入的属性提供setter方法
3)生命周期不同:
传统JavaBean作为值对象传递,不接受任何容器管理其生命周期;Spring中的Bean由Spring管理其生命周期行为
Spring3.0提供的Java配置管理
使用Java类进行配置管理,不使用XML配置管理
三个常用的Annotation:
1)@Configuration:
用于修饰一个Java配置类
2)@Bean:
用于修饰一个方法,将该方法的返回值定义成容器中的一个Bean
3)@Value:
用于修饰一个Field,用于配置一个值
4)@import:
修饰一个Java配置类,用于向当前Java配置类中导入其他Java配置类
5)@Scope:
用于修饰一个方法,指定该方法对应的Bean的生命域
6)@Lazy:
用于修饰一个方法,指定该方法对应的Bean是否需要延迟初始化
7)@DependOn:
用于修饰一个方法,指定在初始化该方法对应的Bean之前初始化指定Bean
创建Bean实例:
1)调用构造器创建Bean实例
class属性必须指定,即Bean的实现类,若提供设置注入,则提供无参数的构造器
2)调用静态工厂方法创建Bean
class属性必须指定,但此时的class属性并不是指定Bean实例的实现类,而是静态工厂类,Spring需要知道由哪个静态工厂方法来创建Bean实例
还需要使用factory-method属性来指定静态工厂方法名,spring将调用静态工厂方法(可能包含一组参数),来返回一个Bean实例,一旦获得了指定的Bean实例,Spring后面处理的步骤与采用普通方法创建Bean实例完全一样
如果静态工厂方法需要参数,则使用
3)调用实例工厂方法创建Bean
实例工厂方法与静态工厂方法只有一点不同:
调用静态工厂方法只需要使用工厂类即可,调用实例工厂方法必须使用工厂实例,总之,一句话,配置静态工厂方法指定静态工厂方法类,配置实例工厂方法则指定工厂实例
注意:
调用实例工厂创建Bean和调用静态工厂创建Bean的区别以及相同之处
区别:
1)调用实例工厂方法创建Bean,必须将实例工厂配置成Bean实例,而静态工厂方法创建Bean,则无需将静态工厂配置成Bean实例
2)调用实例工厂方法创建Bean,必须使用bean-factory属性指定工厂Bean,而静态工厂方法创建Bean,则使用class元素确定静态工厂类
相同:
1)都需使用factory-method属性指定产生Bean实例的工厂方法
2)工厂方法若要指定参数,则需使用
3)其他依赖注入属性,都是用
深入理解,容器中的bean
1、使用抽象bean
2、使用子Bean
注意:
当子Bean指定的配置信息与父Bean模板所指定的配置信息不一致时,子Bean所指定的配置信息将会覆盖父Bean
子bean从父bean定义继承了实现类、依赖关系等配置信息,实际上,子Bean也可以覆盖父Bean的配置信息
例如:
容器中的工厂Bean
工厂Bean是Spring的一种特殊Bean,必须实现FactoryBean接口
FactoryBean接口是工厂Bean的标准接口,实现该接口的Bean通常只能作为工厂Bean使用,但我们将工厂Bean部署在容器中,并通过getBean()方法来获取工厂Bean时,,容器不会返回FactoryBean实例,而是返回FactoryBean的产品
获取Bean本身的id
对于一个真正的应用而言,一个Bean与Bean之间的关系是通过依赖注入管理的,常常不会通过调用容器的getBean方法来获取Bean实例
通过Spring提供的BeanNameAware接口允许Bean类获取部署该Bean时指定的id属性
BeanNameAware接口提供一个方法:
setBeanName(Stringname),该方法的name参数就是Bean的id,实现该方法的Bean类就可通过该方法来获得部署该Bean的id
强制初始化Bean
为了让指定Bean在目标Bean之前初始化,可以使用depends-on属性,该属性可以在初始化zhudiaoBean之前,强制初始化一个或多个Bean,配置如下:
容器中Bean的生命周期
Spring可以管理singleton作用域Bean的生命周期,Spring可以精确的知道该Bean何时被创建、何时被初始化完成、容器何时准备销毁该Bean实例
对于singleto作用域的Bean,Spring容器知道Bean何时实例化结束、何时销毁,Spring可以管理实例化结束之后和销毁之前的行为
管理Bean的生命周期行为主要有如下两个时机:
1)注入依赖关系之后
2)即将销毁Bean之前
依赖关系注入之后的行为
Spring提供两种方式在Bean全部属性设置成功后执行特定行为
1)使用init-method属性
2)实现InitializingBean接口
Bean销毁之前的行为
与定制初始化行为相似,Spring也提供两种方法定制Bean实例销毁之前的特定行为,这两种方式如下:
1)使用destroy-method属性
2)实现DisposableBean接口
小意见
在非web应用的项目中,如果项目服务关闭了,Spring会自动销毁创建的容器,但是在非web应用的项目中,则需要我们手动去销毁
Spring在AbstractApplicationContext中定义了一个registerShutdownHook()的方法,只要我们调用该方法就行了
String[]getBeanDefinitionNames();// 返回工厂中所有Bean的名字
ApplicationContextAware使用理解
当一个类实现了这个接口(ApplicationContextAware),这个类就可以方便获得ApplicationContext中的所有Bean。
换句话说,就是这个类可以直接获取Spring配置文件中,所有有引用到的Bean
协调作用域不同的Bean
AOP面向切面编程
aop就是纵向的编程,如下图所示,业务1和业务2都需要一个共同的操作,与其往每个业务中都添加同样的代码,不如写一遍代码,让两个业务共同使用这段代码。
spring中面向切面变成的实现有两种方式,一种是动态代理,一种是CGLIB,动态代理必须要提供接口,而CGLIB实现是有继承
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- spring 学习心得