spring註解版 使用FactoryBean(工廠Bean)註冊元件
阿新 • • 發佈:2018-12-16
一般在容器中註冊元件都使用@Bean或者之前講的@Import,當然還有包掃描+元件標註註解的方法。今天學了一個工廠Bean的方式註冊元件,正好也在學設計模式,研究研究
玩FactoryBean需要搞一個類去實現它,老規矩,類名MyFactoryBean
import org.springframework.beans.factory.FactoryBean; import test.spring.po.ZhangSan; public class MyFactoryBean implements FactoryBean<ZhangSan> { // 返回一個ZhangSan物件,這個物件會新增到容器中 public ZhangSan getObject() throws Exception { return new ZhangSan(); } public Class<?> getObjectType() { return ZhangSan.class; } // 是否單例 public boolean isSingleton() { return false; } }
當然還是需要@Bean
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan(value = "top.blogs") public class MainConfig { @Bean public MyFactoryBean getFactoryBean() { return new MyFactoryBean(); } }
最後搞個測試類(還是沒習慣用junit)
import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import test.spring.config.MainConfig; public class Main { public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class); Object bean1 = applicationContext.getBean("getFactoryBean"); Object bean2 = applicationContext.getBean("getFactoryBean"); System.out.println(bean1 == bean2); } }
當然這裡列印的是false,因為前面isSingleton這個方法我返回的是false。還有一點就是getBean("getFactoryBean") 獲取的是ZhangSan物件而不是工廠物件,若想獲取工廠物件需要在getFactoryBean 前加個& 也就是getBean("&getFactoryBean") ,這裡是因為spring的BeanFactory介面為我們定義了FactoryBean字首為&,如下圖