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


    项目中用到需要初始化一些数据,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.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task"  
    4.     xsi:schemaLocation="http://www.springframework.org/schema/context   
    5.                            http://www.springframework.org/schema/context/spring-context-3.1.xsd    
    6.                            http://www.springframework.org/schema/beans   
    7.                            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd    
    8.                            http://www.springframework.org/schema/task   
    9.                            http://www.springframework.org/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.   
  • 相关阅读:
    设计模式——策略模式
    设计模式——设计原则
    设计模式——工厂模式
    设计模式——装饰模式
    C#一些常用方法
    设计模式——代理模式
    设计模式——模板模式
    开始博客园之前的一些相对自己说的话
    Python02 分支结构
    dns轮训python 04
  • 原文地址:https://www.cnblogs.com/sikewang/p/5622978.html
Copyright © 2020-2023  润新知