zoukankan      html  css  js  c++  java
  • Spring Ioc-依赖注入的几种方式

    一 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,就只能够使用配置文件方式了。其它的就看实际项目选择了。
     
  • 相关阅读:
    【原创翻译】The Free Lunch Is Over
    【原创】基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结(二)
    【原创】基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结(一)
    实现内容提供者步骤
    为什么需要内容提供者
    aidl的应用场景
    aidl介绍
    百度音乐盒框架
    通过接口方式调用服务里面的方法
    通过bindservice方式调用服务方法里面的过程
  • 原文地址:https://www.cnblogs.com/zydzyd/p/5629311.html
Copyright © 2011-2022 走看看