SpringIOC.docx

上传人:b****1 文档编号:1163601 上传时间:2023-04-30 格式:DOCX 页数:20 大小:95.56KB
下载 相关 举报
SpringIOC.docx_第1页
第1页 / 共20页
SpringIOC.docx_第2页
第2页 / 共20页
SpringIOC.docx_第3页
第3页 / 共20页
SpringIOC.docx_第4页
第4页 / 共20页
SpringIOC.docx_第5页
第5页 / 共20页
SpringIOC.docx_第6页
第6页 / 共20页
SpringIOC.docx_第7页
第7页 / 共20页
SpringIOC.docx_第8页
第8页 / 共20页
SpringIOC.docx_第9页
第9页 / 共20页
SpringIOC.docx_第10页
第10页 / 共20页
SpringIOC.docx_第11页
第11页 / 共20页
SpringIOC.docx_第12页
第12页 / 共20页
SpringIOC.docx_第13页
第13页 / 共20页
SpringIOC.docx_第14页
第14页 / 共20页
SpringIOC.docx_第15页
第15页 / 共20页
SpringIOC.docx_第16页
第16页 / 共20页
SpringIOC.docx_第17页
第17页 / 共20页
SpringIOC.docx_第18页
第18页 / 共20页
SpringIOC.docx_第19页
第19页 / 共20页
SpringIOC.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

SpringIOC.docx

《SpringIOC.docx》由会员分享,可在线阅读,更多相关《SpringIOC.docx(20页珍藏版)》请在冰点文库上搜索。

SpringIOC.docx

SpringIOC

Spring

Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由RodJohnson在其著作ExpertOne-On-OneJ2EEDevelopmentandDesign中阐述的部分理念和原型衍生而来。

它是为了解决企业应用开发的复杂性而创建的。

框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。

Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。

然而,Spring的用途不仅限于服务器端的开发。

从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

Spring架构图

核心容器

●Core模块:

封装了框架依赖的最底层部分,包括资源访问、类型转换及一些常用工具类。

●Beans模块:

提供了框架的基础部分,包括反转控制和依赖注入。

其中BeanFactory是容器核心,本质是“工厂设计模式”的实现,而且无需编程实现“单例设计模式”,单例完全由容器控制,而且提倡面向接口编程,而非面向实现编程;所有应用程序对象及对象间关系由框架管理,从而真正把你从程序逻辑中把维护对象之间的依赖关系提取出来,所有这些依赖关系都由BeanFactory来维护。

●Context模块:

以Core和Beans为基础,集成Beans模块功能并添加资源绑定、数据验证、国际化、JavaEE支持、容器生命周期、事件传播等;核心接口是ApplicationContext。

●EL模块:

提供强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。

AOP模块:

SpringAOP模块提供了符合AOPAlliance规范的面向方面的编程(aspect-orientedprogramming)实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中;这样各专其职,降低业务逻辑和通用功能的耦合。

Spring能做什么?

Spring除了不能帮我们写业务逻辑,其余的几乎什么都能帮助我们简化开发:

一、Spring根据配置文件来进行创建及组装对象间依赖关系,只需要改配置文件即可,无需重新编译。

Spring能帮我们根据配置文件创建及组装对象之间的依赖关系。

二、重复业务逻辑的处理,在AOP思想中,Spring面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制等。

三、原始的支持jdbc事务处理繁琐,Spring能非常简单的帮我们管理数据库事务。

四、Spring还提供了与第三方ORM框架无缝集成,而且自己也提供了一套JDBC访问模板,来方便数据库访问。

五、Spring还提供与第三方Web(如Struts、JSF)框架无缝集成,而且自己也提供了一套SpringMVC框架,来方便web层搭建。

六、Spring能方便的与JavaEE(如JavaMail、任务调度)整合,与更多技术整合(比如缓存框架)。

Spring的优点:

非常轻量级的容器,低侵入,代码污染低。

独立于各种应用服务器.DI(IOC)降低了业务对象替换复杂性;spring调度..;

Spring官方下载:

http:

//repo.spring.io/libs-release-local/org/springframework/

先实战

一、建立一个新的项目

a)建立新的项目;

b)建立需要的Javabean类

c)引入spring的jar包

 

实体类Users

publicclassUsersimplementsSerializable{

privateStringname;

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

@Override

publicStringtoString(){

//TODOAuto-generatedmethodstub

return"你好:

"+name;

}

}

Spring3配置文件:

xmlversion="1.0"encoding="UTF-8"?

>

//www.springframework.org/schema/beans"

xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance"

xsi:

schemaLocation="http:

//www.springframework.org/schema/beans

http:

//www.springframework.org/schema/beans/spring-beans-3.0.xsd">

xml文件中设置了bean,包含在中。

每个bean都有一个唯一的id。

测试类:

publicclassTestEntity{

publicstaticvoidmain(String[]args){

ApplicationContextcontext=newClassPathXmlApplicationContext(

"applicationContext.xml");

Usersu=(Users)context.getBean("u");

//u.setName("小白");

System.out.println(u);

}

}

以上的案例?

IOC(DI)配置及应用

一、什么是IOC、DI

IOC:

InversionofControl控制反转:

其作用是实例化具体的bean,动态装配bean

三种说法:

①原来类的一些成员属性(例如UserService中的userDao成员属性)是由当前类(UserService)自己控制,现在不是由当前类(UserService)自己控制,而是由容器(运行环境上下文、Spring)帮我们来控制。

②原来我们自己控制是控制实现,而现在Spring是利用接口来控制的。

所以我们由原来控制实现转为spring现在来控制接口(向上反转).

③当一对象需要依赖另外一个对象时,通常用调用对来来创建被调用对象的实例,在Spring中,创建被调用对象的工作不再由调用对象来完成,而是由Spring容器来完成,然后注入调用对象,这就是控制反转。

由以上说法可知:

本来是由我(应用程序本身)来控制的,现在我交给容器(Spring)来控制。

IoC很好的体现了面向对象设计法则之一,好莱坞法则:

“别找我们,我们找你”。

DI:

DependencyInjection依赖注入:

一些成员属性(例如UserService中的userDao成员属性)依赖Spring容器来注入

好处:

是spring的核心机制,可以使Spring的bean以配置文件组织在一起,而不是硬编码方式耦合,耦合性相对来降低了;另外,注入是使用配置文件来实现,这样修改来非常的方便.

举例理解IOC?

大家想想咯…

DI与IOC相对来说是一样的概念。

当然有时候,我们也说,IOC其实是一种设计模式,而DI是一种具体的实现方式。

SpringIoc容器解析:

SpringIoc容器的代表就是org.springframework.beans包中的BeanFactory接口,BeanFactory接口提供了IoC容器最基本功能;而org.springframework.context包下的ApplicationContext接口扩展了BeanFactory,还提供了与SpringAOP集成、国际化处理、事件传播及提供不同层次的context实现(如针对web应用的WebApplicationContext)。

简单说,BeanFactory提供了IoC容器最基本功能,而ApplicationContext则增加了更多支持企业级功能支持。

ApplicationContext完全继承BeanFactory,因而BeanFactory所具有的语义也适用于ApplicationContext。

容器实现一览:

•XmlBeanFactory:

BeanFactory实现,提供基本的IoC容器功能,可以从classpath或文件系统等获取资源;

(1)Filefile=newFile("fileSystemConfig.xml");

Resourceresource=newFileSystemResource(file);

BeanFactorybeanFactory=newXmlBeanFactory(resource);

(2)

Resourceresource=newClassPathResource("classpath.xml");BeanFactorybeanFactory=newXmlBeanFactory(resource);

•ClassPathXmlApplicationContext:

ApplicationContext实现,从classpath获取配置文件;

BeanFactorybeanFactory=

newClassPathXmlApplicationContext("classpath.xml");

•FileSystemXmlApplicationContext:

ApplicationContext实现,从文件系统获取配置文件。

BeanFactorybeanFactory=

newFileSystemXmlApplicationContext("fileSystemConfig.xml");

ApplicationContext接口获取Bean方法简介:

•ObjectgetBean(Stringname)根据名称返回一个Bean,客户端需要自己进行类型转换;

•TgetBean(Stringname,ClassrequiredType)根据名称和指定的类型返回一个Bean,客户端无需自己进行类型转换,如果类型转换失败,容器抛出异常;

•TgetBean(ClassrequiredType)根据指定的类型返回一个Bean,客户端无需自己进行类型转换,如果没有或有多于一个Bean存在容器将抛出异常;

•MapgetBeansOfType(Classtype)根据指定的类型返回一个键值为名字和值为Bean对象的Map,如果没有Bean对象存在则返回空的Map。

IoC容器到底是如何工作的呢?

①配置文件的准备工作:

在配置文件applicationContext.xml中声明Bean,也就是为Bean配置元数据。

②IoC容器解析元数据:

IoC容器的BeanReader读取并解析配置文件,根据定义生成BeanDefinition配置元数据对象,IoC容器根据BeanDefinition进行实例化、配置及组装Bean。

③实例化IoC容器:

由客户端实例化容器,获取需要的Bean。

 

二、Bean的标识

SpringIoC容器目的就是管理Bean,这些Bean将根据配置文件中的Bean定义进行创建,而Bean定义在容器内部由BeanDefinition对象表示,该定义主要包含以下信息:

●全限定类名(FQN):

用于定义Bean的实现类;

●Bean行为定义:

这些定义了Bean在容器中的行为;包括作用域(单例、原型创建)、是否惰性初始化及生命周期等;

●Bean创建方式定义:

说明是通过构造器还是工厂方法创建Bean;

●Bean之间关系定义:

即对其他bean的引用,也就是依赖关系定义,这些引用bean也可以称之为同事bean或依赖bean,也就是依赖注入。

一般配置文件结构如下:

1、标签主要用来进行Bean定义;

2、alias用于定义Bean别名的;

3、import用于导入其他配置文件的Bean定义,这是为了加载多个配置文件,当然也可以把这些配置文件构造为一个数组(newString[]{“config1.xml”,config2.xml})传给ApplicationContext实现进行加载多个配置文件,那一个更适合由用户决定;这两种方式都是通过调用BeanDefinitionReader读取Bean定义,内部实现没有任何区别。

标签可以放在下的任何位置,没有顺序关系。

注xml配置文件中标签中的属性名称如下:

标签中的属性id与name作用是一样,区别在于id中不可以含有特殊字符,而name中可以有特殊字符;id是确定该bean的唯一属性,而name可以指定一个或者多个名称,各个名称之间用逗号或分号分开。

后面的为bean的别名。

测试如下代码功能:

xmlversion="1.0"encoding="UTF-8"?

>

//www.springframework.org/schema/beans"

xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance"

xsi:

schemaLocation="http:

//www.springframework.org/schema/beans

http:

//www.springframework.org/schema/beans/spring-beans-3.0.xsd">

--第一种写法只包含了class-->

--第二种写法包含了idclass-->

 

--第三种写法包含了nameclass-->

--第四种写法包含了class-->

--m4的别名-->

测试类:

/**

*

*@authorknowno

*

*/

publicclassTestMessage{

@Test

publicvoidiocTest01()

{

BeanFactorybf=newClassPathXmlApplicationContext("applicationContext.xml");

Messagem=bf.getBean(Message.class);

System.out.println(m);

}

@Test

publicvoidiocTest02()

{

BeanFactorybf=newClassPathXmlApplicationContext("applicationContext.xml");

Messagem=(Message)bf.getBean("m2");

System.out.println(m);

}

@Test

publicvoidiocTest03()

{

BeanFactorybf=newClassPathXmlApplicationContext("applicationContext.xml");

Messagem=(Message)bf.getBean("m3");

System.out.println(m);

}

@Test

publicvoidiocTest04()

{

BeanFactorybf=newClassPathXmlApplicationContext("applicationContext.xml");

Messagem=(Message)bf.getBean("malias");

System.out.println(m);

}

}

∙Bean命名约定:

Bean的命名遵循XML命名规范,但最好符合Java命名规范,由“字母、数字、下划线组成“,而且应该养成一个良好的命名习惯,比如采用“驼峰式”,即第一个单词首字母开始,从第二个单词开始首字母大写开始,这样可以增加可读性。

三、注入类型(Injectingdependencies)

1、setter(重要)

2、构造方法(了解)

3、接口注入(了解)

(一)setter注入类型

就是在bean中使用setXXX方法进行注入来

在bean类中,成员属性需要setXXX方法如下:

publicclassUserService{

privateUserDaoud;

publicUserDaogetUd(){

returnud;

}

publicvoidsetUd(UserDaoud){

this.ud=ud;

}

publicvoidaddUser(Usersu){

ud.addUser(u);

}

}

(二)构造方法

首先在bean类中需要有成员属性作为参数的构造方法

代码如下:

publicclassUserService{

privateUserDaouserDao=newUserDaoImpl();

publicUserService(UserDaouserDao){

super();

this.userDao=userDao;

}

publicUserDaogetUserDao(){returnuserDao;}

publicvoidsetUserDao(UserDaouserDao){this.userDao=userDao;}

publicvoidadd(Useru){userDao.save(u);}

}

注意:

背景较深的代码为构造方法,带有参数的构造方法

spring配置文件如下:

使用进行构造方法注入

当构造方法注入时,构造方法中有多个参数时,可以使用以下两种方式注入:

bean代码:

publicclassExampleBean{

privateintyears;

privateStringultimateAnswer;

publicExampleBean(intyears,StringultimateAnswer){

this.years=years;

this.ultimateAnswer=ultimateAnswer;

}

}

1、参数类型方式进行区分参数:

xml配置文件:

注意:

这样就是参数类型为int的注入7500000,而参数类型为java.lang.String的参数注入”42”,但这个方法不适合多个参数是相同的类型。

2、使用索引

xml配置文件

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

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2