Spring是为企业应用开发提供的一个轻量级解决方案,是一个开源的IOC和 AOP框架,通过使用Spring可以大大地提高企业应用的开发效率。它包括有下面这些优点:1、 低侵入式设计,代码的污染极低;2、 Spring容器降低了业务对象替换的复杂性,提高了组件之间的解耦;3、 Spring的AOP支持允许将一些通用任务如:安全,事务,日志等进行集中式处理,从而提供了更 好的复用;4、 Spring的ORM和DAO提供了与第三方持久化框架的良好整合,并简化了底层的数据库访问;5、 Spring的高度开发性,并不强制应用完全依赖于Spring,开发者可自由选择Spring框架的部分或 全部。
在使用Spring框架时,必须使用到Spring Core Container(Sping容器)。Spring的所有模块都是建立在核心容器之上的,它的主要功能就是将配置文件中的<bean>元素转换成运行时的对象,然后根据配置文件中的描述将它们注入到相应的对象中,它的流程是1、将配置文件读入到容器中;2、通过Java的反射机制将配置文件中对对象的描述转换为Java对象;3、将这些Java对象按照配置文件中的定义将他们注入到各自匹配的对象中去。
下面我们用一个简单的Spring配置文件来简单描述下他的作用域。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 定义需要被spring容器管理的Bean组件时,有2个参数是必填的 --> <!-- spring容器所生成的Bean对象,有各自不同作用域,有以下5种: scope="singleton" ,默认配置,是在容器管理的情况下,是有效的。 scope="prototype"也叫原型,它的生命周期是:从容器创建,到垃圾回收为止是有效的。换 句话说,就是spring容器只负责创建,不负责它的生命周期的管理。 scope="request",也叫请求作用域,它的有效范围是在同一个请求的范围内。 scope="session", 也叫会话作用域,它的有效范围是在同一个会话的范围内。 scope="global session" 也叫全局会话作用域,它适用于门户网站,并且服务器之间session同步 --> <bean id="user" class="com.lovo.beans.UserBean" scope="singleton"> <!-- spring容器允许我们,在创建对象时,通过Set(),初始化某些属性 <property name="userName" value="张三"></property> <property name="password" value="123456"></property> --> <!-- spring容器允许我们,在创建对象时,通过构造函数(),初始化某些属性--> <constructor-arg index="0"> <value>张三</value> </constructor-arg> <constructor-arg index="1"> <value>123456</value> </constructor-arg> </bean><!-- byName,byType都是使用setting注入方式 -->
<!-- byName自动装配的时候,会根据调用者中需要装配的属性名称去查找spring容器, 看是否有对应的Bean组件的实例存在,如果存在就自动装配,如果不存在,就装配失败 但不会抛出任何异常,只有当程序运行时,才会抛出空指针异常 --> <!-- byType自动装配的时候,会根据调用者中需要装配的属性的类型去查找spring容器, 看是否有对应的相同类型的Bean组件的实例存在,如果类型是接口,那么就去找接口的实现类, 如果存在就自动装配,如果不存在就装配不成功,但不会抛出任何异常,运行时,代码会抛出 空指针。当符合条件的实例多于1个时,它不就知道装配哪一个了,就抛出:UnsatisfiedDependencyException --> <!-- constructor构造装配,会根据构造器中的属性类型去查找容器,如果类型是接口, 那么就去找接口的实现类,如果存在就自动装配,如果不存在就装配不成功, 但不会抛出任何异常,运行时,代码会抛出 空指针。当符合条件的实例多于1个时,它不就知道装配哪一个了,就抛出:UnsatisfiedDependencyException--> <!-- 手动装配>自动装配,当两者同时存在时,以手动装配为准,自动装配虽然简单,直接,粗暴,但是结构不清晰,维护性很差,推荐使用手动装配 --> <bean id="userServiceImpl" class="com.lovo.service.impl.UserServiceImpl" autowire="byName"> <!--手动装配,需要提供setting(); --> <property name="userDaoImpl" ref="userDaoImpl"></property> <!--手动装配,构造注入,当参数只有1位时,无需定义index=0 <constructor-arg> <ref bean="userDaoImpl"/> </constructor-arg> --> </bean><bean id="userDaoImpl" class="com.lovo.dao.impl.UserDaoImpl"></bean>
<import resource="beans.xml"></import>