分享

Spring为某个属性注入值或为某个方法的返回值

 李副营长 2014-12-16

项目中用到需要初始化一些数据,Spring提供了filed的值注入和method的返回值注入。


一、Field值的注入                                                                                           

     filed值注入需要使用org.springframework.beans.factory.config.FieldRetrievingFactoryBean来获取类的静态变量。

例如,我们通常在接口中定义常量:

Java代码  收藏代码
  1. package com.wy.inject;  
  2.   
  3. /** 
  4.  *  
  5.  * @author wy 
  6.  * 
  7.  */  
  8. public interface Fruit {  
  9.     public String APPLE = "苹果";  
  10.     public String ORANGE = "桔子";  
  11. }  

 下面利用FieldRetrievingFactoryBean获取CarBandType接口中定义的常量,并注入到某个bean的属性中:

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www./schema/beans"  
  3.     xmlns:xsi="http://www./2001/XMLSchema-instance" xmlns:task="http://www./schema/task"  
  4.     xsi:schemaLocation="http://www./schema/context   
  5.                            http://www./schema/context/spring-context-3.1.xsd    
  6.                            http://www./schema/beans   
  7.                            http://www./schema/beans/spring-beans-3.1.xsd    
  8.                            http://www./schema/task   
  9.                            http://www./schema/task/spring-task-3.1.xsd">  
  10.     <!-- 1、通过注入属性   
  11.     <bean id="appleBean" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">  
  12.         <property name="staticField" value="com.wy.inject.Fruit.APPLE" />  
  13.     </bean>  
  14.     <bean id="apple" class="com.wy.inject.Apple">  
  15.         <property name="name" ref="appleBean" />  
  16.     </bean>-->  

 Spring还允许用户用常量的全限定名作为FieldRetrievingFactoryBean的id,其效果和通过配置staticField属性是一样的:

Xml代码  收藏代码
  1. <!-- 2、通过全限量名称  
  2.     <bean id="com.wy.inject.Fruit.APPLE" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">  
  3.     </bean>  
  4.     <bean id="apple" class="com.wy.inject.Apple">  
  5.         <property name="name" ref="com.wy.inject.Fruit.APPLE" />  
  6.     </bean> -->  

 当然,也可以直接将FieldRetrievingFactoryBean以内置bean的方式对属性进行赋值,这样在配置上更紧凑一些:

Xml代码  收藏代码
  1. <!-- 3、通过内置Bean的方式   
  2.     <bean id="apple" class="com.wy.inject.Apple">  
  3.         <property name="name">  
  4.             <bean id="com.wy.inject.Fruit.APPLE" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/>  
  5.         </property>  
  6.     </bean>-->  

 

二、Method返回值的注入
Method返回值的注入需要使用MethodInvokingFactoryBean来完成。

在xml配置中,需要设定targetObject和targetMethod来指定目标bean和方法。如果使用静态方法,则需要指定targetClass和targetMethod。

1、非静态方法配置文件如下:

Xml代码  收藏代码
  1. <!-- 1、Method返回值的注入  
  2.     <bean id="apple" class="com.wy.inject.Apple">  
  3.         <property name="name">  
  4.             <bean  
  5.                 class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">  
  6.                 <property name="targetObject">  
  7.                     <ref local="cons" />  
  8.                 </property>  
  9.                 <property name="targetMethod">  
  10.                     <value>getAPPLE</value>  
  11.                 </property>  
  12.             </bean>  
  13.         </property>  
  14.     </bean>  
  15.     <bean id="cons" class="com.wy.inject.Cons" /> -->  

 2、静态方法的配置

Xml代码  收藏代码
  1. <!-- 2、静态方法返回值的注入 -->  
  2.     <bean id="banna" class="com.wy.inject.Banna">  
  3.       <property name="name">  
  4.         <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">  
  5.           <property name="targetClass">  
  6.             <value>com.wy.inject.Cons</value>  
  7.           </property>  
  8.           <property name="targetMethod">  
  9.             <!-- getBann必须是静态方法 -->  
  10.             <value>getBann</value>  
  11.           </property>  
  12.         </bean>  
  13.       </property>  
  14.     </bean>  

 涉及到的类:

Apple.java

Java代码  收藏代码
  1. package com.wy.inject;  
  2.   
  3. /** 
  4.  *  
  5.  * @author wy 
  6.  *  
  7.  */  
  8.   
  9. public class Apple {  
  10.     String name = null;  
  11.     String price = null;  
  12.   
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.   
  17.     public void setName(String name) {  
  18.         this.name = name;  
  19.     }  
  20.   
  21.     public String getPrice() {  
  22.         return price;  
  23.     }  
  24.   
  25.     public void setPrice(String price) {  
  26.         this.price = price;  
  27.     }  
  28.   
  29. }  

 Cons.java

Java代码  收藏代码
  1. package com.wy.inject;  
  2.   
  3. /** 
  4.  *  
  5.  * @author wy 
  6.  *  
  7.  */  
  8. public class Cons {  
  9.     public String APPLE = "苹果";  
  10.     public String ORANGE = "桔子";  
  11.     public static String Bann = "香蕉";  
  12.   
  13.     public String getAPPLE() {  
  14.         return APPLE;  
  15.     }  
  16.   
  17.     public void setAPPLE(String aPPLE) {  
  18.         APPLE = aPPLE;  
  19.     }  
  20.   
  21.     public String getORANGE() {  
  22.         return ORANGE;  
  23.     }  
  24.   
  25.     public void setORANGE(String oRANGE) {  
  26.         ORANGE = oRANGE;  
  27.     }  
  28.       
  29.       
  30.       
  31.     public static String getBann() {  
  32.         return Bann;  
  33.     }  
  34.   
  35.     public static void setBann(String bann) {  
  36.         Bann = bann;  
  37.     }  
  38.   
  39. }  

 Banna.java

Java代码  收藏代码
  1. package com.wy.inject;  
  2.   
  3. /** 
  4.  *  
  5.  * @author wy 
  6.  * 
  7.  */  
  8. public class Banna {  
  9.     String name = null;  
  10.     String price = null;  
  11.   
  12.     public String getName() {  
  13.         return name;  
  14.     }  
  15.   
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.   
  20.     public String getPrice() {  
  21.         return price;  
  22.     }  
  23.   
  24.     public void setPrice(String price) {  
  25.         this.price = price;  
  26.     }  
  27. }  

 三、测试例子

Java代码  收藏代码
  1. package com.wy.inject;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class InjectTest {  
  7.     public Apple apple = null;  
  8.     public Banna banna = null;  
  9.     public InjectTest() {  
  10.         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");   
  11. //      apple = (Apple)context.getBean("apple");  
  12.         banna = (Banna)context.getBean("banna");  
  13.     }  
  14.       
  15.     public void name(){  
  16. //      System.out.println("Fruit name=" + apple.getName());  
  17.         System.out.println("Fruit name=" + banna.getName());  
  18.     }  
  19.   
  20.     /** 
  21.      * @param args 
  22.      */  
  23.     public static void main(String[] args) {  
  24.         new InjectTest().name();  
  25.     }  
  26.   
  27. }  

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多