Spring基于setter方法的依赖注入

广告位

基于setter DI由容器调用setter方法​​对bean调用无参构造器或无参static工厂方法实例化b…

基于setter DI由容器调用setter方法​​对bean调用无参构造器或无参static工厂方法实例化bean之后完成。

例如:

下面的例子显示了一个本编辑TextEditor类文只能是依赖注入使用纯基于setter方法的注入。

我们使用Eclipse IDE,然后按照下面的步骤来创建一个Spring应用程序:

步骤 描述
1 Create a project with a nameSpringExampleand create a packagecom.yiibaiunder thesrcfolder in the created project.
2 Add required Spring libraries usingAdd External JARsoption as explained in theSpring Hello World Examplechapter.
3 Create Java classesTextEditor,SpellCheckerandMainAppunder thecom.yiibaipackage.
4 Create Beans configuration fileBeans.xmlunder thesrcfolder.
5 The final step is to create the content of all the Java files and Bean Configuration file and run the application as explained below.

这里是TextEditor.java文件的内容:

  package com.yiibai;    public class TextEditor {     private SpellChecker spellChecker;       // a setter method to inject the dependency.     public void setSpellChecker(SpellChecker spellChecker) {        System.out.println("Inside setSpellChecker." );        this.spellChecker = spellChecker;     }     // a getter method to return spellChecker     public SpellChecker getSpellChecker() {        return spellChecker;     }       public void spellCheck() {        spellChecker.checkSpelling();     }  }

在这里,需要检查setter方法​​的命名约定。设置我们使用setSpellChecker()方法,这是非常类似于Java POJO类的变量的拼写检查器。让我们创造另一个相关的类文件SpellChecker.java,内容如下:

  package com.yiibai;    public class SpellChecker {     public SpellChecker(){        System.out.println("Inside SpellChecker constructor." );     }       public void checkSpelling() {        System.out.println("Inside checkSpelling." );     }       }

以下是MainApp.java文件的内容:

  package com.yiibai;    import org.springframework.context.ApplicationContext;  import org.springframework.context.support.ClassPathXmlApplicationContext;    public class MainApp {     public static void main(String[] args) {        ApplicationContext context =                new ClassPathXmlApplicationContext("Beans.xml");          TextEditor te = (TextEditor) context.getBean("textEditor");          te.spellCheck();     }  }

以下是配置文件beans.xml文件里面有配置为基于setter方法​​注入:

  <?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">       <!-- Definition for textEditor bean -->     <bean id="textEditor" class="com.yiibai.TextEditor">        <property name="spellChecker" ref="spellChecker"/>     </bean>       <!-- Definition for spellChecker bean -->     <bean id="spellChecker" class="com.yiibai.SpellChecker">     </bean>    </beans>

应该注意在基于构造函数注入和setter注入定义beans.xml文件的差异。唯一的区别是,我们已经使用<constructor-arg>标签为基于构造函数的注入和的<property>标签为基于setter注入的<bean>元素内。

需要注意的第二个重要的一点是,如果传递一个引用到一个对象,需要使用<property>标签的ref属性,如果是直接传递一个值,那么应该使用value属性。

创建源代码和bean配置文件完成后,让我们运行应用程序。如果一切顺利,这将打印以下信息:

  Inside SpellChecker constructor.  Inside setSpellChecker.  Inside checkSpelling.  

采用p名称空间的XML配置:

如果你有很多的setter方法​​则可以很方便地使用p名称空间的XML配置文件中。让我们查看他们的区别:

让我们来用的<property>标签标准的XML配置文件的例子:

  <?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="john-classic" class="com.example.Person">        <property name="name" value="John Doe"/>        <property name="spouse" ref="jane"/>     </bean>       <bean name="jane" class="com.example.Person">        <property name="name" value="John Doe"/>     </bean>    </beans>

上面的XML配置可重写使用p-namespace如下一个简洁的方法:

  <?xml version="1.0" encoding="UTF-8"?>    <beans xmlns="http://www.springframework.org/schema/beans"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xmlns:p="http://www.springframework.org/schema/p"      xsi:schemaLocation="http://www.springframework.org/schema/beans      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">       <bean id="john-classic" class="com.example.Person"        p:name="John Doe"        p:spouse-ref="jane"/>     </bean>       <bean name="jane" class="com.example.Person"        p:name="John Doe"/>     </bean>    </beans>

在这里,不应该在指定原始值和对空间对象引用的区别。-ref部分表示,这不是直链的值,而是一个引用到另一个bean中。

贺, 贺朝

关于作者: 贺朝

为您推荐