spring的控制反转,依赖注入以及概述

1. Spring 的概述:

Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson在其著作 Expert One-On-One J2EE Development and Design 中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring 使用基本的 JavaBean来完成以前只可能由 EJB 完成的事情。然而,Spring 的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。Spring 的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring 是一个分层的 JavaSE/EEfull-stack(一站式) 轻量级开源框架。
EE 开发分成三层结构:
 * WEB 层:Spring MVC.
 * 业务层:Bean 管理:(IOC) 
* 持久层:Spring 的 JDBC 模板.ORM 模板用于整合其他的持久层框架. 

Expert One-to-One J2EE Design and Development :J2EE 的设计和开发:(2002.EJB)
Expert One-to-One J2EE Development without EJB :J2EE 不使用 EJB 的开发.

1.2 为什么学习 Spring:


方便解耦,简化开发
Spring 就是一个大工厂,可以将所有对象创建和依赖关系维护,交给 Spring 管理AOP 编程的支持
Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程方便程序的测试
Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz 等)的直接支持
降低 JavaEE API 的使用难度
Spring 对 JavaEE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等),都提供了封装,使这些 API 应用难度大大降低

1.2.1 Spring 的版本:

Spring 3.X 和 Spring4.X

1.2.2 Spring 的入门案例:(IOC)


1.2.2.1 IOC 的底层实现原理

IOC:Inversion of Control 控制反转. 指的是 对象的创建权反转(交给)给 Spring. 作用是实现了程序的解耦合.

1.2.2.2 步骤一:下载 Spring 的开发包:

官网:http://spring.io/
下 载 地 址 :http://repo.springsource.org/libs-release-local/org/springframework/spring 解压:(Spring 目录结构:)
* docs :API 和开发规范.
* libs :jar 包和源码.
* schema :约束.

1.2.5  Spring 的相关配置:

1.2.5.1 id 属性和 name 属性标签的配置

id:Bean起个名字.在约束中采用ID的约束:唯一.必须以字母开始,可以使用字母、数字、连字符、

下划线、句话、冒号id:不能出现特殊字符.

id=”bookAction”>

name:Bean 起个名字.没有采用ID的约束.name:出现特殊字符.如果没有 id 的话,name

以当做 id使用.

*整合 struts1的时候:

name=”/loginAction”> 


1.2.5.2 scope 属性:Bean 的作用范围.

*singleton:默认值,单例的.

*prototype:多例的.

*request:WEB项目中,Spring创建一个 Bean的对象,将对象存入到 request域中.

*session:WEB项目中,Spring创建一个 Bean的对象,将对象存入到 session域中.

*globalSession:WEB项目中,应用在Porlet环境.如果没有Porlet环境那么 globalSession相当

session.


1.2.5.3 Bean 的生命周期的配置:

通过配置标签上的 init-method作为 Bean的初始化的时候执行的方法,配置 destroy-method

作为 Bean的销毁的时候执行的方法。

销毁方法想要执行,需要是单例创建的 Bean而且在工厂关闭的时候,Bean才会被销毁.


1.2.6  Spring 的Bean 的管理 XML 的方式:

1.2.6.1 Spring 生成 Bean 的时候三种方式(了解)

【无参数的构造方法的方式:

<beanid="bean1"class="cn.et.spring.demo3.Bean1">bean>

【静态工厂实例化的方式】

提供一个工厂类:

publicclassBean2Factory{

 publicstaticBean2getBean2(){

returnnewBean2();

}

}

<beanid="bean2"class="cn.et.spring.demo3.Bean2Factory"

factory-method="getBean2"/>

【实例工厂实例化的方式】

提供 Bean3的实例工厂:

publicclassBean3Factory{

publicBean3getBean3(){

returnnewBean3();

}

}

<beanid="bean3Factory"class="cn.et.spring.demo3.Bean3Factory">bean>

<beanid="bean3"factory-bean="bean3Factory"factory-method="getBean3">bean>


1.2.6.2Spring 的 Bean 的属性注入: 

【构造方法的方式注入属性】

<beanid="car"class="cn.itcast.spring.demo4.Car">

<constructor-argname="name"value="保时捷"/>

<constructor-argname="price"value="1000000"/>

bean>

 

set 方法的方式注入属性】

 

<beanid="car2"class="cn.et.spring.demo4.Car2">

<propertyname="name"value="奇瑞QQ"/>

<propertyname="price"value="40000"/>

bean>

 

 

1.2.6.3Spring 的属性注入:对象类型的注入:


<beanid="person"class="cn.et.spring.demo4.Person">

<propertyname="name"value="会希"/>

<propertyname="car2"ref="car2"/> 

bean>


1.2.6.4名称空间 p 的属性注入的方式:Spring2.x 版本后提供的方式


第一步:引入 p名称空间

<beansxmlns="http://www.springframework.org/schema/beans"

xmlns:p="http://www.springframework.org/schema/p"

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.xsd">

 

 

第二步:使用 p名称空间.

*普通属性:p:属性名称=””

*对象类型属性:p:属性名称-ref=””


<beanid="car2"class="cn.et.spring.demo4.Car2"p:name="宝 马 7" p:price="1200000"/>

id="person"class="cn.et.spring.demo4.Person"p:name="     思 聪    "

p:car2-ref="car2"/>

 

 

1.2.6.5SpEL 的方式的属性注入:Spring3.x 版本后提供的方式.

 

 

SpELSpringExpressionLanguage.

 

语法:#{SpEL}

 

<beanid="car2"class="cn.et.spring.demo4.Car2">

<propertyname="name"value="#{'奔驰'}"/><propertyname="price"value="#{800000}"/>

bean>

<beanid="person"class="cn.et.spring.demo4.Person"> 

<propertyname="name"value="#{'冠希'}"/>

<propertyname="car2"value="#{car2}"/>bean>

<beanid="carInfo"class="cn.et.spring.demo4.CarInfo">bean>


 

 

 

引用了另一个类的属性

 

<beanid="car2"class="cn.et.spring.demo4.Car2">

 

name="name"value="#{carInfo.carName}"/>

name="price"value="#{carInfo.calculatePrice()}"/>

 

bean>

 

 

1.2.6.6注入复杂类型:

 

 

<beanid="collectionBean"class="cn.et.spring.demo5.CollectionBean">

 

<propertyname="arrs">

<list> 

<value>会希value>

<value>冠希value>

<value>天一value>

list>

property>

 

<propertyname="list">

 

<list>

<value>芙蓉value>

<value>如花value>

<value>凤姐value>

list>

property>

 

<propertyname="map">

<map>

<entrykey="aaa"value="111"/>

<entrykey="bbb"value="222"/>

<entrykey="ccc"value="333"/>

map>

property>

 

<propertyname="properties">

<props>

<propkey="username">rootprop>

<propkey="password">123prop>


你可能感兴趣的:(spring)