當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
factorybean 代理类不能按照类型注入_Spring注解驱动开发之四——@Import快速导入组件、FactoryBean 定义工厂注册组件...
生活随笔
收集整理的這篇文章主要介紹了
factorybean 代理类不能按照类型注入_Spring注解驱动开发之四——@Import快速导入组件、FactoryBean 定义工厂注册组件...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文包含以下內容:
@Import快速導入組件
配合ImportSelector 導入組件
配合ImportBeanDefinitionRegistrar 導入組件
FactoryBean 定義工廠注冊組件
1.@Import快速導入組件
在前幾篇推文中,通過@Bean 標記在方法上,手動new 一個實例注入到容器中,這種方法,會比較繁瑣,需要手動編寫過多無意義代碼 @Bean("bill") public Person person01(){ return new Person("Bill Gates",62); }通過@Import,方法可以不需要編寫構造方法,快速注冊組件1)建立測試類public?class?Color?{}public class Red {??}public class Blue {??}public class Yellow {}2)使用@Import({Color.class,Red.class})? 導入類組件@Import({Color.class,Red.class})public class MainConfig2 {}3)編寫測試方法@Testpublic void testImport(){ printBeans(applicationContext); Blue bean = applicationContext.getBean(Blue.class); System.out.println(bean);}private void printBeans(AnnotationConfigApplicationContext applicationContext){ String[] definitionNames = applicationContext.getBeanDefinitionNames(); for (String name : definitionNames) { System.out.println(name); }}4)運行測試,可以看到@Import注解創建的組件默認以全類名作為id 的形式注入到容器中2.配合ImportSelector 導入組件
在@Import注解 中還能添加ImportSelector查看源碼,看到這個接口需要實現selectImports 返回類的全類名即可:1)創建Selector//自定義邏輯返回需要導入的組件public class MyImportSelector implements ImportSelector { //返回值,就是到導入到容器中的組件全類名 //AnnotationMetadata:當前標注@Import注解的類的所有注解信息 @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { // TODO Auto-generated method stub //importingClassMetadata //方法不要返回null值 return new String[]{"peason.zxc.annotation.bean.Blue","peason.zxc.annotation.bean.Yellow"}; }}2)在注解中引入Selector@Import({Color.class, Red.class,MyImportSelector.class})3)獲得測試結果,能夠注入"peason.zxc.annotation.bean.Blue","peason.zxc.annotation.bean.Yellow"等組件3.配合ImportBeanDefinitionRegistrar 導入組件
在@Import注解中還能添加ImportSelector1)建立自定義的實現類其中有2個參數:AnnotationMetadata:當前類的注解信息BeanDefinitionRegistry :當前容器的注冊入口,可以直接注冊組件下面例子是如果注冊器內存在Red 、Blue 的組件,就進行創建rainBow 實例,此處id 累哦自定義名稱public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { /** * AnnotationMetadata:當前類的注解信息 * BeanDefinitionRegistry:BeanDefinition注冊類; * 把所有需要添加到容器中的bean;調用 * BeanDefinitionRegistry.registerBeanDefinition手工注冊進來 */ @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { boolean definition = registry.containsBeanDefinition("peason.zxc.annotation.bean.Red"); boolean definition2 = registry.containsBeanDefinition("peason.zxc.annotation.bean.Blue"); if(definition && definition2){ //指定Bean定義信息;(Bean的類型,Bean。。。) RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class); //注冊一個Bean,指定bean名 registry.registerBeanDefinition("rainBow", beanDefinition); } }}2)在注解中引入@Import({Color.class, Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})3)測試結果,成功根據條件注入了id 為rainBow的組件4.FactoryBean 定義工廠注冊組件
在@Import注解,會調用默認的無參構造器創建對象,而注入容器FactoryBean 的主鍵會默認調用,這個接口的getObject()返回實例進行組件的創建。下面進行測試:1)創建實現FactoryBean 接口的類//創建一個Spring定義的FactoryBeanpublic class ColorFactoryBean implements FactoryBean { //返回一個Color對象,這個對象會添加到容器中 @Override public Color getObject() throws Exception { // TODO Auto-generated method stub System.out.println("ColorFactoryBean...getObject..."); return new Color(); } @Override public Class> getObjectType() { // TODO Auto-generated method stub return Color.class; } //是單例? //true:這個bean是單實例,在容器中保存一份 //false:多實例,每次獲取都會創建一個新的bean; @Override public boolean isSingleton() { // TODO Auto-generated method stub return false; }}2)通過@Bean 將工廠注入到容器中 @Bean public ColorFactoryBean colorFactoryBean(){ return new ColorFactoryBean(); }3)編寫測試方法 @Test public void testImport(){ printBeans(applicationContext); //工廠Bean獲取的是調用getObject創建的對象 Object bean2 = applicationContext.getBean("colorFactoryBean"); Object bean3 = applicationContext.getBean("colorFactoryBean"); System.out.println("bean的類型:"+bean2.getClass()); System.out.println(bean2 == bean3); Object bean4 = applicationContext.getBean("&colorFactoryBean"); System.out.println(bean4.getClass()); }4)獲得結果5)分析結果:1.在打印所有的組件可以看到colorFactoryBean 組件通過獲取,多次可以看到,2次獲取結果并非同一個實例對象,由此見得,在方法isSingleton 生效了,采用多實例構建//是單例? //true:這個bean是單實例,在容器中保存一份 //false:多實例,每次獲取都會創建一個新的bean; @Override public boolean isSingleton() { // TODO Auto-generated method stub return false; }2.通過該id 獲取該組件,獲取到bean 的類型為peason.zxc.annotation.bean.Color?由此可見,獲取對象時通過調用getObject函數創建組件//返回一個Color對象,這個對象會添加到容器中 @Override public Color getObject() throws Exception { // TODO Auto-generated method stub System.out.println("ColorFactoryBean...getObject..."); return new Color(); }3.可以通過&符號獲取到FactoryBean 對象即最后的結果class peason.zxc.annotation.bean.ColorFactoryBean,可以看到源碼所示,指定了&符號-END-
可以關注我的公眾號,免費獲取價值1980元學習資料
點擊“在看”,學多少都不會忘~
總結
以上是生活随笔為你收集整理的factorybean 代理类不能按照类型注入_Spring注解驱动开发之四——@Import快速导入组件、FactoryBean 定义工厂注册组件...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: div中内容靠右_python读取exc
- 下一篇: python自己创建模块_创建并发布自己