您的位置:首页 > 其它

IOC(DI)- Inversion of Control(Dependency Injection)

2012-08-23 05:02 211 查看
IOC-Inversion of Control
DI-Dependency Injection
这两个其实是一个概念
可能叫做依赖注入更容易理解。它有什么好处呢?

通过写配置文件,容器会帮助你注入你要用到的实现,开发者就不再去管new之类的东西了。

通常来说其实也就是配置,之前不用框架的时候,你总得new,总得各种父类引用指向子类对象,但是都是hard coded,写死了的。无论怎么说,一旦写死了,都会造成修改的不方便,如果将所有的这样的信息都写在一个配置文件里面,那么实际的功能型代码只需要使用接口的名字来调用方法和属性,配置文件帮助你关联。实现类有很多,但是都符合多态原理,所以将来你要更换某个实现,就修改配置文件的某一行,或者几行就行。如果你要写测试,那么就将配置文件copy一份,将实现类全部更换一下就是了。

在设计的时候,多多考虑各种情况,比如多人协作,避免冲突等等。比如配置文件,条件允许的话分模块多写几份。各人负责自己的那一份,要修改别人的知会一下别人,这样就不会造成太多修改的冲突。

1.注入
注入的方式主要有2种,无论你使用哪一种方式,结果就是,当容器创建bean的时候,它就会将这些依赖的类注入进来。

1)setter methods,使用set方法将依赖关系以属性的形式注入
setter方法是推荐使用的。它会需要在bean里面加入property的标签。比如<property name="userName" value="root" />或者<property name="beanTwo" ref="anotherBean" />
然后在需要使用的类里面使用set方法将这些配置一下就行。

2)constructors,将依赖的类直接以构造器参数的形式注入
这个是通过使用构造器还配置,也要在xml里面配置,使用constructor-arg标签。比如
<constructor-arg ref="anotherBean" />或者<constructor-arg type="int" value="1" />

2.BeanFactory
依赖注入容器的核心就是2个包,org.springframework.beans和org.springframework.context。
BeanFactory接口是用工厂模式实现的,提供一个高级的配置机制。

3.ApplicationContext
它是BeanFactory的子接口。它对Spring的AOP特性有了更加好的结合,除此之外,还有一些其它的特性。

简单来说就是BeanFactory提供了基本的功能,ApplicationContext在此基础上添加了很多企业级相关的功能。

这个接口其实代表的就是IOC容器,通过读取配置文件,该容器就知道要分别实例化,装配哪些对象。配置文件可以是XML文件,可以是Java Annotation,可以是Java代码。

其中有2个实现类是常常使用的,就是ClassPathXmlApplicationContext 和 FileSystemXmlApplicationContext。

4.bean
这个是Spring操作的核心。IOC容器所管理的,也就是Bean。一个Bean就是一个对象,通过IOC容器(ApplicationContext)来实例化,装配和管理。Beans和他们之间的依赖关系,都是通过容器的配置文件来反映的。

一个IOC容器管理着一个或者多个beans,他们都是根据开发者提供给容器的配置文件来创建的,也就是<bean />定义的东西。在容器的内部,这些bean的定义都会被包装成BeanDefinition对象。

1)Naming beans
每个bean都有一个id,也可以有多个,但是不推荐,至少现阶段不要尝试。

最好别使用特殊字符,如果使用,需要进行一定的声明,这个也不是现阶段需要考虑的。

你可以不指定id,但是这样你就无法进行获取,一般来说这种情况都是用于内部bean,这个也不是现阶段要考虑的。

2)Instantiating beans
IOC在被请求的时候,就会根据被请求的bean的name去查看配置文件,然后将那些定义的东西读取出来,创建或者获取相应的对象。

通常在你写一个bean标签定义的时候,id和class这2个属性是必须有的。class也就是对应实际要实例化成为对象的类。

其实,这样通过指定bean类然后后来容器通过反射来创建就相当于使用了new操作符。(有一些关于内部类的定义就先暂时忽略了)

3)Scope
默认情况下是singleton,但是你也可以自己指定。通常都不用配置这个东西,最多最多就是配置为prototype,那么就不只创建一个实例。

5.Configuration metadata

1)介绍

其实就是配置文件,告诉IOC容器,要实例化和装配哪些bean,通常是一个XML文件(虽然说这个并不是唯一的途径,但是业界上基本上都是使用这种方式)。对于IOC容器来说,配置文件的格式无所谓,它仅仅关心里面的配置。

还有一种比较新的配置方法就是使用Annotation,也就是Google Guice的方法。配置文件至少包含一个,通常来说肯定不止一个bean的定义。在XML文件中,它们是以<bean />的方式来展示的。这些bean对应那些构成应用的实际的对象。

举个简单的配置的例子就是

<?xml version="1.0" encoding="UTF-8" ?>
<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-3.0.xsd">
<bean id=" " class=" ">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>

id就是用来区分某个bean的,class就是该bean对应的类的类名,在bean的属性里面可以定义依赖关系。

2)实例化一个IOC容器

简单说来就是实例化一个ApplicationContext。举个例子

ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});

也就是说把你的配置文件的路径传给IOC容器,然后它自己就知道去读取里面的配置。

你可以写多个配置文件,比如所谓的services.xml,其它的比如sources.xml,然后最后定义一个总的配置文件,比如bean.xml,将其它的配置文件全部引入进去,引入的时候注意必须在同一路径,如果配置文件在某个文件夹中,那么这个文件夹的路径必须和总配置文件位于同一个路径中。

6.Annotation配置
Annotation更加方便,它会在XML注入之前进行注入,所以需要小心的是,xml的配置可能会覆盖掉annotation的配置。

Annotation非常方便,拿Spring的@AutoWired来说吧,其实它就跟Guice里面的@Inject是一样的。假设你使用构造方法来注入的话,那你就可以在构造方法上面写一个@AutoWired注释,这样你就可以不用自己去配置XML里面的property标签了,只需要定义基本的bean就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: