spring学习心得.docx

上传人:b****1 文档编号:28981950 上传时间:2023-07-20 格式:DOCX 页数:16 大小:3.13MB
下载 相关 举报
spring学习心得.docx_第1页
第1页 / 共16页
spring学习心得.docx_第2页
第2页 / 共16页
spring学习心得.docx_第3页
第3页 / 共16页
spring学习心得.docx_第4页
第4页 / 共16页
spring学习心得.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

spring学习心得.docx

《spring学习心得.docx》由会员分享,可在线阅读,更多相关《spring学习心得.docx(16页珍藏版)》请在冰豆网上搜索。

spring学习心得.docx

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,则可为该元素增加lazy-init属性,指定该属性为true,则Spring不会预初始化该Bean实例,如下面配置文件所示:

容器中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,元素用来定义嵌套Bean,嵌套Bean只对嵌套它的外部Bean有效,Spring容器无法直接访问嵌套Bean,因此定义嵌套Bean时无需指定id属性

例子:

 

注入集合值:

例子:

--为List属性提供属性值-->

--每个value、ref、bean都配置一个List元素-->

小学

中学

大学

--为Map属性配置属性值-->

--为为每个entry配置一个key-value对-->

--为Map属性配置属性值-->

--为每个entry配置一个key-value对-->

--为每个properties属性配置属性值-->

--为每个prop元素配置一个属性项,其中key指定属性名-->

正常

173

--为Set属性配置属性值-->

--每个value、ref、bean都配置一个Set元素-->

普通的字符串

--为数组属性配置属性值-->

--每个value、ref、bean都配置一个数组元素-->

疯狂java

javaEE企业级

疯狂学习

 

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实现是有继承

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 韩语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1