Spring学习笔记

一、Inversion of Control 反射控制

  1、在spring中体现为“依赖注入”,具体方式就是:由spring的IoC Service Provider提供服务:

  

  2、注入的具体方式:三种

  (1)构造方法注入:这个简单,就是在声明一个构造方法,IoC Service Provider检查被注入对象的构造方法,然后为其注入依赖对象,因此,被注入对象的构造乃至整个生命周期都应该由IoC Service Provider管理

  (2)setter注入方式:就是在类中提供getter/setter方法,方便spring在需要时注入有关类,当然setter的参数是一个接口

  (3)接口注入方式:某类实现一个接口,IoC Service Provider通过该接口来了解应该为被注入对象注入什么依赖对象

  

  这种方式虽然达到了依赖注入的目的,但被注入对象必须声明和实现另外的接口,即引入了另外的东西,显得有点多此一举。

  IoC的意义:从主动获取到依赖注入,到底有什么好处?大概有这样的:不会对业务对象造成很强的入侵性,使用IoC后,对象具有更好的可测试性、可重用性、可扩展性——————这些都是泛泛而谈,具体的作用,在项目中实践总结吧。

  3.IoC的实现:IoC如何知道诸多对象间的对应关系,无非是这几种笨办法:直接编写代码来注册这些对应信息、XML文件记录对应信息、其他一切有效的方式

  (1)直接编码的方式是在容器启动之前,我们就通过程序编码的方式将被注入对象和依赖对象注册到容器中,并声明他们的依赖注入关系,例如有这样的代码:

IoContainer container = ...;
container.register(FXNewsProvider.class, new FXNewsProvider());
container.register(IFXNewsListener.class, new DowJonesNewsListener());
...
...
FXNewsProvider newsPrivoder = (FXNewsProvider)container.get(FXNewsProvider.class);
newProvider.getAndPersistNews();
...

  简直说就是先在容器中注册好具体实例,当需要时就从容器中拿出来返回给我们。在接口方式实现的时候,除了上面的代码外,还要加一个,将“注入标志接口”与相应的依赖对象绑定一下,才能让容器知道是怎样的对应关系。

IoContainer container = ...;
container.register(FXNewsProvider.class, new FXNewsProvider());
container.register(IFXNewsListener.class, new DowJonesNewsListener());
...
container.bind(IFXNewsListenerCallable.class, container.get(IFXNewsListener.class));
...
FXNewsProvider newsPrivoder = (FXNewsProvider)container.get(FXNewsProvider.class);
newProvider.getAndPersistNews();
...

  (2)xml配置文件方式,在spring配置文件中管理和保存依赖注入信息。

<bean id="newsProvider" class="..FXNewsProvider">
    <property name="newsListener">
        <ref bean="djNewsListener"/>
    </property>
    <property name="newPersistener">
        <ref bean="djNewsPersister"/>
    </property>
</bean>
<bean id="djNewsListener" class="..impl.DowJonesNewsListener">
</bean>
<bean id="djNewsPersister" class="..impl.DowJonesNewsPersister">
</bean>        

读取配置文件完成装配,然后调用:

...
container.readConfigurationFiles(...);
FXNewsProvider newsProvide = (FXNewsProvider)container.getBean("newProvider");
newsProvider.getAndPersistNews();
...

  (3)元数据方式,代表实现是Google Guice,这是一套IoC框架,运用java注解来实现对象依赖注入

public class FXNewsProvider{
    private IFXNewsListener newsListener;
    private IFXNewsPersister newsPersister;
    @Inject
    public FXNewsProvider(IFXNewsListener listener, IFXNewsPersister persister){
        this.newsListener = listener;
        this.newsPersister = persister;
    }
}

这里通过注解的方式,指明需要IoC Service Provider通过构造方法注入,余下的信息由Guice的Module提供。

 

    

 

posted @ 2018-08-13 15:47  myjhaha  阅读(159)  评论(0编辑  收藏  举报