一、基本概念Spring 的核心是轻量级(Lightweight )的容器(Container ),它实现了IoC 容器、非侵入性(No intrusive )的框架,并提供AOP 概念的实现方式,提供对持久层(Persistence )、事务(Transaction )的支持,提供MVC Web 框架的实现,并对一些常用的企业服务API (Application Interface )提供一致的模型封装,是一个全方位的应用程序框架(Application framework ),另外,Spring 也提供了对现有框架(Struts 、JSF 、Hibernate 等)的整合方案。
Spring 旨在分离体系结构的层次,因此每一层都可以修改而不会影响到其它层。
每一层都不知道其上层的关注点;就其可能而言,只对所紧挨的下一层有依赖。
层与层之间的依赖通常是以接口的形式表现,以确保其耦合尽可能松散。
容器管理事务,容器,贯穿始终:1、对象生命周期的管理。
2、容器本身具备功能,加在自己的类中。
需要自己调用则为显示调用。
而尽量用容器隐式调用,Spring 即为隐式对现有表现层的支持与ORM 紧密结合,可使用声明式事务管理 AOP 标准接口的实现(容器管理的声明式的种种事务)对JDBC 采用模板回调;声明的JDBC 事务管理.提供了Bean 工厂对Bean 工厂的扩展(比如对事务、国际化的支持)自己的MVC 实现调用、声明式编程。
Spring 轻量级容器体现在:只需设置一个Jar 文件到CLASSPATH ,不用去调用它,但又可以拥有其强大的功能。
组件的极大程度的复用。
让层与层中耦合度低——Loosely-Coupled 工厂类创建DAO 对象。
声明式编程:在xml 文件中声明。
基于POJO 类,支持事务,事务是根本;而EJB 事务由Container 管理。
Spring 将 View 层与持久层,比如与Hibernate 联系起来。
Spring 简化Hibernate 的使用,还可以帮助管理Hibernate 。
Spring 本身没有O-R_mapping ,因为有Hibernate ,她已经做得很好了。
Spring 将编译时异常(checked )转化为运行时异常(runtime )。
比如,JDBC 则为编译时异常,即必须写try…catch ;而Hibernate 程序为运行时异常。
在spring-framework-2.0.5\dist 目录下 有jar 文件、 dtd 文件、 tld 文件。
总之,Spring 是一个轻型容器(light-weight container ),其核心是Bean 工厂(Bean Factory ),用以构造我们所需要的M (Model )。
在此基础之上,Spring 提供了AOP (Aspect-Oriented Programming, 面向层面的编程)的实现,用它来提供非管理环境下申明方式的事务、安全等服务;对Bean 工厂的扩展ApplicationContext 更加方便我们实现Java EE 的应用;DAO/ORM 的实现方便我们进行数据库的开发;Web MVC 和Spring Web 提供了Java Web 应用的框架或与其它流行的Web 框架进行集成。
二、IoC (Inversion of Control )1、定义:组件..之间的依赖关系....由容器..在运行时决定。
例如:B 对象所依赖的A 对象是由 Spring 创建好并且通过Set 方法传递注入过来的。
最基本的优点体现在:若A 为接口,让B 依赖于接口。
只看接口不管实现类。
可把工厂类全部替换掉。
对象均为容器创建。
到时还能把容器的功能融入到其中。
IoC 要求:容器尽量不要侵入到应用程序中去,应用程序本身可以依赖于抽象的接口,容器根据这些接口所需要的资源注入到应用程序中,也就是说应用程序不会主动向容器JavaBean 调用/包含 Spring控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系。
请求资源;容器会自动把这些对象给应用程序。
●IoC有基于set方式的注入(property)、基于构造方法的注入。
●IoC核心的bean工厂:在Spring中,bean工厂创建的各个实例称作bean。
业务组件间的依赖是容器(Bean工厂)解决的。
BeanFactory负责读取Bean定义文件,管理对象的加载、生成,维护Bean对象与Bean对象的依赖关系,负责Bean的生命周期,对于简单的应用程序来说,使用BeanFactory就已经足够来管理Bean,在对象的管理上就可以获得许多的便利性。
●Spring中有两个包里的类都可以做IoC:beans包:org.springframework.beans包;context包:org.springframework.context包,其类功能更加强大。
2、bean工厂创建bean的三种方式:✧通过构造方法直接创建:<bean id=”your_id” class=”bean class name”>✧通过静态工厂方法创建:<bean id=“your_id”class=”factory class name” factory-method=”createFactory”>✧通过非静态工厂方法创建:<bean id=”factory” class=”factory class name”><bean id=”your_id”factory-bean=” factory” factory-method=” createFactory”>3、Spring中实现IoC的方式:依赖注入(Dependency Injection)Spring中依赖注入的两种方式:通过setter方法注入:<property name=”username”><value>Huangwp</value></property>其中,name属性的取值依setter方法名而定。
Spring推荐使用setter方法注入。
通过构造方法注入:<constructor-arg index=”0”><value>黄总</value></ constructor-arg><constructor-arg index=”1”> <value>男</value></ constructor-arg><constructor-arg type=“int ”> <value>46</value></ constructor-arg>其中,index 表示构造方法中的参数索引(第一个参数索引为0),type 表示构造方法中参数的类型。
● 两种注入方式的区别:⏹ Constructor :可以在构建对象的同时,把依赖关系也构建好。
对象创建后好就已经准备好了所有的资源,安全性高。
⏹ Setter: 创建完对象之后再通过set()方法进行属性的设定。
4、设置属性时可选的标签:value :基本类型(包装类型)或String 类型 ref :引用工厂中其它的bean list :List 或数组类型set :Set 类型。
用法与list 类似。
map :Map 类型props :Properties 类型,键值为String 类型的,所以直接写值。
举例:List SetMap Properties如果key依赖其它对象用key-ref, 如果还是一个Map,可再嵌套。
◆abstract 属性如果在配置文件中把某个方法设置成为abstract=“true”的(缺省false ),那么不能通过beanFactory 获得bean 的实例。
◆lazy-init属性如果使用的是XmlBeanFactory来获得beanFactory:缺省的是延迟加载,如果不想延迟加载,则需要把工厂bean实例的lazy-init设置为false,例如:<bean id=“carFactory" lazy-init="false" class="spring. ioc.CarFactory"></bean>5、自动装配:自动将某个bean 注入到另一个bean的属性当中。
(bean标签的autowire属性)其分类如下表:(大型应用不推荐使用,因为可读性太差)模式说明no 不使用自动装配。
必须通过ref元素指定依赖,这是默认设置。
由于显式指定协作者可以使配置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。
而且在某种程度上,它也是系统架构的一种文档形式。
byName 根据属性名自动装配。
此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。
例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。
byType 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。
如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。
若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。
如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。
constructor与byType的方式类似,不同之处在于它应用于构造器参数。
如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
模式 说明autodetect 通过bean 类的自省机制(introspection )来决定是使用constructor 还是byType 方式进行自动装配。
如果发现默认的构造器,那么将使用byType 方式。
6、依赖检查:检查bean 的属性是否完成依赖关系的注入(bean 标签的dependency-check 属性)⏹ 作用:检查bean 的属性是否完成依赖关系的注入 ⏹ 分类:错误!未找到引用源。
.simple : 只查看简单的类型是否完成依赖注入(基本类型和字符串)错误!未找到引用源。
.objects:检查对象类型是否完成依赖注入 错误!未找到引用源。