程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(4)

spring注解驱动开发-组件注册-使用FactoryBean注册组件

发布于2021-06-12 14:25     阅读(219)     评论(0)     点赞(12)     收藏(4)


之前的一节说明了import的注册的几种方式,接下来来说最后一种注册方式:FactoryBean

我们需要实现FactoryBean,然后默认获取到的是工厂bean调用的getObject的对象。

1.我们先创建类MyBeanFactory来实现FactoryBean方法

  1. package springanntition.beanFactory;
  2. import org.springframework.beans.factory.FactoryBean;
  3. import springorgin.demo.configbean.Color;
  4. public class MyBeanFactory implements FactoryBean<Color> {
  5. // 返回一个color对象,这个对象会添加到容器中
  6. public Color getObject() throws Exception {
  7. System.out.println("MyBeanFactory...getObject()。。。");
  8. return new Color();
  9. }
  10. // 返回对象的类型
  11. public Class<?> getObjectType() {
  12. return Color.class;
  13. }
  14. // 是否是单例
  15. // 返回true:这个bean是单实例的,在容器中就创建一份
  16. // 返回false:是多实例的,每次获取都会创建一个新的bean,可以直接在里面改
  17. public boolean isSingleton() {
  18. return true;
  19. }
  20. }

创建color类

  1. public class Color {
  2. }

2.创建BeanTest类作为配置类用@Bean注入MyBeanFactory

  1. package springanntition.beanFactory;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. @Configuration
  5. public class BeanTest {
  6. @Bean
  7. public MyBeanFactory myBeanFactory() {
  8. return new MyBeanFactory();
  9. }
  10. }

添加测试类

  1. package springannotion.conditional;
  2. import org.junit.Test;
  3. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  4. import springanntition.beanFactory.BeanTest;
  5. import springanntition.zjimport.ImportZJTest;
  6. import springorgin.demo.configbean.RainBow;
  7. public class ImportTest {
  8. AnnotationConfigApplicationContext applicationContext1 = new AnnotationConfigApplicationContext(BeanTest.class);
  9. @Test
  10. public void iocTest() {
  11. printBeans(applicationContext1);
  12. //*****************************此为beanFactory测试***************************************
  13. // 工厂bean获取的是调用Object创建对象
  14. Object bean2 = applicationContext1.getBean("myBeanFactory");
  15. Object bean3 = applicationContext1.getBean("myBeanFactory");
  16. System.out.println("bean的类型:" + bean2.getClass());
  17. System.out.println(bean2 == bean3);
  18. //*****************************此为beanFactory测试结束************************************
  19. }
  20. private void printBeans(AnnotationConfigApplicationContext applicationContext) {
  21. String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
  22. for (String name : beanDefinitionNames) {
  23. System.out.println(name);
  24. }
  25. }
  26. }

运行,我们看到容器中注入了以下这些,myBeanFactory的想要注入的就是Color对象,也发现获取两次对象打印的都是true证明是单例。

我们修改看下怎么设置多实例的,在MyBeanFactory类里的isSingleton方法将return true改成return false

再运行一下,发现获取两次getObject方法,并且两个对象并不相等

测试类加上获取bean的id方式

  1. public class ImportTest {
  2. AnnotationConfigApplicationContext applicationContext1 = new AnnotationConfigApplicationContext(BeanTest.class);
  3. @Test
  4. public void iocTest() {
  5. printBeans(applicationContext1);
  6. //*****************************此为beanFactory测试***************************************
  7. // 工厂bean获取的是调用Object创建对象
  8. Object bean2 = applicationContext1.getBean("myBeanFactory");
  9. Object bean3 = applicationContext1.getBean("myBeanFactory");
  10. System.out.println("bean的类型:" + bean2.getClass());
  11. System.out.println(bean2 == bean3);
  12. // &就是获取容器中的id
  13. Object bean4 = applicationContext1.getBean("&myBeanFactory");
  14. System.out.println("bean4:" + bean4.getClass());
  15. //*****************************此为beanFactory测试结束************************************
  16. }
  17. private void printBeans(AnnotationConfigApplicationContext applicationContext) {
  18. String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
  19. for (String name : beanDefinitionNames) {
  20. System.out.println(name);
  21. }
  22. }
  23. }

运行一下,发现获取的是MybeanFactory的全限定名

 

原文链接:https://blog.csdn.net/dfBeautifulLive/article/details/117710865



所属网站分类: 技术文章 > 博客

作者:你不要惹我

链接:http://www.javaheidong.com/blog/article/222377/5db4bfb771cb158e440f/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

12 0
收藏该文
已收藏

评论内容:(最多支持255个字符)