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/beans
http://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>