上文我们说的就是SpringIOC的思想,此文,我们写几个实例,具体介绍IOC容器的使用。
首先,Spring是一个很轻量级的框架,我们只需要下载几个jar包,将其导入项目之中即可,这一步无需多言。
Spring配置文件是IOC容器的核心,他将需要管理的对象都放置于此,利用Java反射的机制获取对象的实例,以及管理对象的依赖关系。
好的,再我们来介绍Spring中的Bean,所谓的Bean其实和Java规范中的JavaBean很像:有着无参数的构造方法;对封装的对象有相应的getter以及setter。在Spring配置文件中配置Bean的方式也很简单,测试项目先写了两个Bean,大致方式就是,给Bean配一个类的全类名,如下:
<beans xmlns="http://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.xsd">
<bean id="userDao2" class="lfq.ima.UserDao2">
</bean>
<bean id="userDao" class="lfq.ima.UserDao" scope="singleton">
<property name="userDao2" ref="userDao2"></property>
</bean>
</beans>
Bean的命名方式有两种,id和name都可以给Bean命名,两者的区别在于:id必须唯一,且不能有特殊字符;而name可以不唯一,且可以有特殊字符,在没有id时,可以做id使用。
* 整合 struts1 的时候:
<bean name=”/loginAction” >
另外的,Bean有五个作用域:singleton(默认):单例,即Spring中的每一个Bean只获取一个对象实例、prototype(原型):每当一个Bean被调用一次,都会有一个新的对象实例产生;后三种是要在web环境下才有效:request:在每一次Http请求中,Bean都会被新建一次,一个请求共享一个实例、session:再一次会话中,Bean会被共享,且只有一个、globalSession:不做了解。
在这里,稍作提一下ApplicationContext和BeanFactory的区别,两者很像,都是Spring的核心,都可以构造Bean和管理Bean,且ApplicationContext是BeanFactory的继承,ApplicationContext不仅有着BeanFactory的所有功能,还提供着额外功能:一、在ApplicationContext刚实例化时便会加载所有的单例Bean;二、能够访问文件的URL;三、可同时加载多个配置文件,等等。
问题就又出现了,在加载ApplicationContext初期会加载所有的单例Bean,如何阻止这种行为呢?在scope="singleton"时,默认的lazy-init属性便是false,我们可以手动地将它设置为true,这样,他就会在第一次被调用时,才会实例化,也可以在beans里面对所有的bean进行该设置。
在bean中可以书写方法,将方法名加入到init-method属性或者destroy-method属性中,即可以分别在bean初始化时或者bean销毁时调用。针对单例的bean来说,Spring容器会在bean销毁或者构建时调用两种方法,但是对于多例的情况来说,Spring容器只会在bean加载时调用init-method,并不会跟踪到destroy-method,可以理解为Spring仅仅只完成了该bean的装配,然后让其交由客户端代码处理。
综上,Spring可以知道singleton的bean全部的生命周期,何时创建,何时销毁,都能了然,然而对于prototype类型的bean的生命周期,Spring无法全局把控,只当将其实例化后就交由客户端。