天天看点

Spring核心机制-依赖注入

依赖注入主要有两种:

设值注入:loc容器使用属性的setter方法来注入被依赖的实例。

属性:通过<property.../>元素配置,对应设值注入。
构造器参数:通过<constructor-arg.../>元素指定,对应构造注入。
<!--配置chinese实例,其实现类是Chinese-->
<bean id="chinese" class="org.crazyit.app.service.impl.Chinese">
    <!--将stoneAxe注入给axe属性-->
    <property name="axe" ref="stoneAxe">
</bean>
<!--配置stoneAxe实例,其实现类是StoneAxe-->
<bean id="stoneAxe" class="org.crazyit.app.service.impl.StoneAxe"/>
           

构造注入:loc容器使用构造器来注入被依赖的实例。

<!--配置chinese实例,其实现类是Chinese-->
<bean id="chinese" class="org.crazyit.app.service.impl.Chinese">
    <!--使用构造注入,为chinese实例注入steelAxe实例-->
    <constructor-arg ref="steelAxe">
</bean>
<!--配置stoneAxe实例,其实现类是StoneAxe-->
<bean id="steelAxe" class="org.crazyit.app.service.impl.SteelAxe"/>
           
如果需要为Bean设置的属性值是容器中另一个Bean实例,则应该使用
<ref.../>元素。
ApplicationContext的事件机制,通过ApplicationEvent和ApplicationListener接口,可以实现ApplicationContext的事件处理。

定义Bean时,需要指定两个属性:
id: 
class:指定该Bean的具体实现类,不能是接口。
容器中Bean的作用域默认singleton单例模式,使用singleton定义的Bean将只有一个实例。
prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。
通过Bean的scope属性设定,singleton、prototype、request、session、globalSession5个值。
区别在于,创建Person实例中Axe属性的时机不同,设值注入是先通过无参数的构造器创建一个Bean实例,然后调用对应的setter方法注入依赖关系;而构造注入则直接调用有参数的构造器,当Bean实例创建完成后,已经完成了依赖关系的注入。

    对于依赖关系无须变化的注入,尽量采用构造注入;而其他的依赖关系的注入,考虑采用设值注入。    

Spring有两个核心接口,BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口。他们都可以代表Spring容器。Spring容器是生成Bean的工厂,并管理容器中的Bean,Bean是Spring管理的基本单位。

    如果有多个属性配置文件,则应采用BeanFactory的子接口ApplicationContext来创建BeanFactory的实例。ApplicationContext通常由两个实现类:
        FileSystemXmlApplicationContext:以基于文件系统的XML配置文件创建ApplicationContext实例,**指定路径下**。
        ClassPathXmlApplicationContext:以类加载路径下的XML配置文件创建ApplicationContext实例。**ClassPath下寻找。**
如果需要同时加载多个XML配置文件,
           
ApplicationContext appContext=new ClassPathXmlApplicationContext(new String[]{"bean.xml","service.xml"});
或者从基于文件系统的路径来搜索配置文件
ApplicationContext appContext=new FileSystemXmlApplicationContext(new String[]{"bean.xml","service.xml"});