javascript
Spring系列(七):@FactoryBean注解用法介绍
今天給大家介紹@FactoryBean注解用法,希望對大家能有所幫助!
? ? ? ? ? ? ? ?
1、@FactoryBean注解介紹
FactoryBean是實現了FactoryBean<T>接口的Bean,可以該Bean的ID從BeanFactory中獲取的實際上是FactoryBean中getObject()方法返回的實例對象,而并不是直接FactoryBean本身,想要獲取FactoryBean對象本身,可以在id前面加一個&符號來獲取。
BeanFactory部分代碼:
說明:String FACTORY_BEAN_PREFIX = "&" ,&符號表示要獲取FactoryBean本身
package org.springframework.beans.factory;import org.springframework.beans.BeansException; import org.springframework.core.ResolvableType; import org.springframework.lang.Nullable;public interface BeanFactory {String FACTORY_BEAN_PREFIX = "&";}2、@FactoryBean的源碼內容如下:
Spring3.0版本之后,FactoryBean開始支持泛型,即接口聲明改為FactoryBean<T>的形式
package org.springframework.beans.factory;import org.springframework.lang.Nullable;public interface FactoryBean<T> {String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";@NullableT getObject() throws Exception;@NullableClass<?> getObjectType();default boolean isSingleton() {return true;} }實現FactoryBean<T>接口有一下三個方法
getObject:獲取bean對應的實例對象
getObjectType:獲取factoryBean獲取到的實例類型
isSingleton:factoryBean創建的實例是否是單實例
3、用法示例
3.1 新建Book.java
package com.spring.bean;public class Book {private String bookName;private String bookType;private double price;public Book(String bookName, String bookType, double price) {this.bookName = bookName;this.bookType = bookType;this.price = price;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getBookType() {return bookType;}public void setBookType(String bookType) {this.bookType = bookType;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "Book{" +"bookName='" + bookName + '\'' +", bookType='" + bookType + '\'' +", price=" + price +'}';} }3.2 新建BookFactoryBean.java
package com.spring.bean;import org.springframework.beans.factory.FactoryBean;public class BookFactoryBean implements FactoryBean<Book> {public BookFactoryBean factoryBeanVO() {return new BookFactoryBean();}public Book getObject() throws Exception {return new Book("紅樓夢", "中國名著", 88);}public Class<?> getObjectType() {return Book.class;}public boolean isSingleton() {return true;} }3.3 FactoryBeanConfig.java
package com.spring.config;import com.spring.bean.BookFactoryBean;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;@Configuration public class FactoryBeanConfig {@Beanpublic BookFactoryBean bookFactoryBean(){return new BookFactoryBean();} }3.4 TestFactoryBean.java
package com.spring.test;import com.spring.config.FactoryBeanConfig; import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class TestFactoryBean {public static void main(String[] args) {AnnotationConfigApplicationContext annotationContext = new AnnotationConfigApplicationContext(FactoryBeanConfig.class);// 獲取工廠類的beanObject bookFactoryBean = annotationContext.getBean("bookFactoryBean");System.out.println(bookFactoryBean.getClass());// 輸出結果:class com.spring.bean.Book//獲取FactoryBean 本身 加 &符號Object bookFactoryBean1 = annotationContext.getBean("&bookFactoryBean");System.out.println(bookFactoryBean1.getClass());// 輸出結果:class com.spring.bean.BookFactoryBean} }4、@FactoryBean應用場景
單一的對象使用FactoryBean意義不大。
創建對象時需要依賴于需要別的接口來監聽數據、根據推送數據過來的接口做一些數據處理。
搭配其他接口協作, 依賴于Spring生命周期, 針對某個時間節點、合適的條件判斷,來生成自己需要的對象。
5、典型應用
MyBatis3 提供 mybatis-spring項目中的 org.mybatis.spring.SqlSessionFactoryBean:
阿里開源的分布式服務框架 Dubbo 中的Consumer 也使用到了FactoryBean
shiro中ShiroFilterFactoryBean
druid的JdbcStatManagerFactoryBean
IT技術分享社區
個人博客網站:https://programmerblog.xyz
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識
總結
以上是生活随笔為你收集整理的Spring系列(七):@FactoryBean注解用法介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 按钮组设置,MATLAB中
- 下一篇: Spring系列(八):Spring生命