} } }

    Spring中Ioc的几种实现体式格式

    添加时间:2013-6-21 点击量:

    一 setter办法注入


    设备文件如下:


    <bean id=helloAction class=org.yoo.action.SpringSetterHelloAction>
    <!-- setter injection using the nested <ref/> element -->
    <property name=helloservice><ref bean=helloService/></property>
    <!--可以不设置类型 -->
    <property name=name value=yoo></property>
    </bean>


    action实现类中代码:


    private IHelloService helloservice;
    private String name ;
    public void sayHello(){
    helloservice.sayHello();
    System.out.println(this.name);
    }


    public void setHelloservice(IHelloService helloservice) {
    this.helloservice = helloservice;
    }


    public void setName(String name) {
    this.name = name;
    }


    这里的name和helloservice都采取属性的setter办法注入。即类中设置一个全局属性,并对属性有setter办法,以供容器注入。


     


    二 机关器注入


    spring也支撑机关器注入,也即有些资猜中的机关子或者机关函数注入。


    先看设备文件:


    <!--通俗机关器注入-->
    <bean id=helloAction class=org.yoo.action.ConstructorHelloAction>
    <!--type 必须为java.lang.String 因为是按类型匹配的,不是按次序匹配-->


    <constructor-arg type=java.lang.String value=yoo/>
    <!-- 也可以应用index来匹配-->
    <!--<constructor-arg index=1 value=42/>-->
    <constructor-arg><ref bean=helloService/></constructor-arg>
    </bean>


    action实现类中代码:


    private HelloServiceImpl helloservice;
    private String name ;

    public SpringConstructorHelloAction(HelloServiceImpl helloservice,String name){
    this.helloservice = helloservice;
    this.name = name ;
    }


    @Override
    public void sayHello() {
    helloservice.sayHello();
    System.out.println(this.name);
    }


    同样设置2个属性,然后在机关函数中注入。


    三静态工厂注入


    设备文件如下:


    <!--静态工厂机存眷入-->


    <!--重视这里的class 带factory-method参数-->


    <!--factory-method的值是FactoryHelloAction中的工厂办法名createInstance-->
    <bean id=helloAction class=org.yoo.di.FactoryHelloAction factory-method=createInstance>
    <constructor-arg type=java.lang.String value=yoo/>
    <constructor-arg><ref bean=helloService/></constructor-arg>
    </bean>



    action实现类:


    private HelloServiceImpl helloservice;
    private String name = null;

    private SpringFactoryHelloAction(String name ,HelloServiceImpl helloservice){
    this.helloservice = helloservice ;
    this.name = name ;
    }

    public static SpringFactoryHelloAction createInstance(String name ,HelloServiceImpl helloservice) {
    SpringFactoryHelloAction fha = new SpringFactoryHelloAction (name,helloservice);
    // some other operations
    return fha;
    }



    @Override
    public void sayHello() {
    helloservice.sayHello();
    System.out.println(this.name);
    }
    四 无设备文件注入(主动注入)


    上方三种办法都须要编写设备文件,在spring2.5中还供给了不编写设备文件的ioc实现。须要重视的是,无设备文件指bean之间依附,不基于设备文件,而不是指没有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
    xsi:schemaLocation=http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd>
    <bean class=org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor/>
    <bean id=helloService class=org.yoo.service.HelloServiceImpl>
    </bean>
    <bean id=helloAction class=org.yoo.action.AutowiredHelloAction>
    </bean>
    </beans>


    可见上方只是设置了helloService和helloAction两个bean,并没有设置helloAction对helloService的依附。


    别的<bean class=org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor/>是必须的,有此才支撑主动注入。


    action实现类:


    /
    属性主动装载
    /
    /
    @Autowired
    private HelloService helloservice;

    @Override
    public void sayHello() {
    helloservice.sayHello();

    上方代码很简单,在属性上加上 @Autowired注释,spring会主动注入HelloService 。


    同样也支撑机关器和setteer办法的注入,如下:


    机关器主动注入:


    /
    还可以应用机关函数设置
    /
    @Autowired
    public SpringAutowiredHelloAction(HelloServiceImpl helloservice){
    this.helloservice = helloservice;
    }


    setter办法主动注入:


    /
    也可以应用set办法设置
    /
    /
    @Autowired
    public void setHelloservice(HelloService helloservice) {
    this.helloservice = helloservice;
    }





    最后在spring的reference文档中有提到,若是不应用主动注入,尽量应用setter办法,一般通用的也是应用setter办法。



    而应用主动注入还是设备文件体式格式,若是jdk低于1.5或者spring不是2.5,就只可以或许应用设备文件体式格式了。其它的就看实际项目选择了。

    我们永远不要期待别人的拯救,只有自己才能升华自己。自己已准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。—— 姚谦《品味》
    分享到: