首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring FactoryBean 進階應用與隱藏技巧

     編輯:Java 相關知識

Spring 中區分「普通 Bean」與「FactoryBean」。FactoryBean 的 getObject() 回傳值才是真正注入容器的物件,廣泛應用於 AOP Proxy、Transaction Proxy 等核心模組。本文透過範例示範動態回傳不同型別、取得 FactoryBean 本身實例的特殊語法 &beanName。

普通 Bean vs FactoryBean

<!-- 普通 Bean:直接回傳 String 實例 -->
<bean name="bean1" class="java.lang.String">
  <constructor-arg value="我是字串!"/>
</bean>

自訂 FactoryBean 範例

public class FactoryBeanDemo implements FactoryBean {
    private String name;

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

    public Object getObject() throws Exception {
        return "date".equals(name) ? new Date() : new String("這是一個字串!");
    }

    public Class getObjectType() {
        return "date".equals(name) ? Date.class : String.class;
    }

    public boolean isSingleton() { return false; }
}

配置與測試

<bean name="myFactoryBean" class="pkg.FactoryBeanDemo"/>
<bean name="myFactoryBean1" class="pkg.FactoryBeanDemo">
  <property name="name" value="date"/>
</bean>
BeanFactory factory = new XmlBeanFactory(res);
System.out.println(factory.getBean("myFactoryBean").getClass());   // class java.lang.String
System.out.println(factory.getBean("myFactoryBean1").getClass());  // class java.util.Date

隱藏技巧:取得 FactoryBean 本身

在 bean 名稱前加 & 即可取得 FactoryBean 實例而非其產出的物件:

System.out.println(factory.getBean("&myFactoryBean").getClass());   // class pkg.FactoryBeanDemo
System.out.println(factory.getBean("&myFactoryBean1").getClass());  // class pkg.FactoryBeanDemo

實務應用場景

  • AOP ProxyFactoryBean:同一配置根據介面動態產生不同業務 Proxy。
  • 動態資料源切換:getObject() 根據租戶上下文回傳對應 DataSource。
  • 延遲初始化重型資源:首次 getObject() 才建立連線池、線程池等昂貴資源。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved