把自定义的对象(或第三方对象) 放到Spring 容器里

自定义对象放入到spring容器内

  • 前言
    • 三种方法
    • 方法一:FactoryBean
      • FactoryBean 介绍
      • FactoryBean将自定义对象放入Spring容器
    • 方法二:@Bean
    • 方法三:registerSingletion

前言

最近看了一位大神的教学视频,目前感觉挺有道理的,写个记录吧 ,防止忘记。
了解如何把自定义的对象(或第三方对象) 放到Spring 容器里
涉及的业务场景有:

  • spring 整合mybatis、
  • 读取配置动态注册多个数据源 循环注册多个DataSource到spring容器内。

FactoryBean 工厂bean
https://blog.csdn.net/zknxx/article/details/79572387

三种方法

  1. FactoryBean
  2. @Bean
  3. API ac.getBeanFactory().registerSingletion

方法一:FactoryBean

FactoryBean 介绍

在我们的开发工作中应该都见过或使用过FactoryBean这个类,也许你会看成了BeanFactory这个类。FactoryBean和BeanFactory虽然长的很像,但是他们的作用确实完全不像。这里你可以想象一下,你会在什么样的场景下使用FactoryBean这个接口?FactoryBean是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程

https://blog.csdn.net/zknxx/article/details/79572387

FactoryBean将自定义对象放入Spring容器

javaConfig

@Configuration
@ComponentScan("com.test.module.aatest") // 要扫描的类包名
public class Appconfig {
}
@Component
public class ZiDingYiFactoryBean implements FactoryBean {
    @Override
    public Object getObject() throws Exception { // 返回一个Bean

        return new A();
    }

    @Override
    public Class<?> getObjectType() {
        return A.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
public class ServiceTest {
    public static void main(String[] args) {
/*
        // xml  模式
        ApplicationContext appContext  = new ClassPathXmlApplicationContext("com/deppon/nhr/module/cops/server/META-INF/appointtest.xml");
        IndexService indexService = (IndexService) appContext.getBean("indexService");
        indexService.getServiceBean();


        System.out.println(appContext.getBean("ziDingYiFactoryBean"));
        // 期待的打印返回的  ziDingYiFactoryBean 对象 ,但是返回 为 ZiDingYiFactoryBean 类的getObject返回的new A();
        System.out.println(appContext.getBean("&ziDingYiFactoryBean"));

*/
         // java 注解
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
        ac.register(Appconfig.class);
        ac.refresh();
        System.out.println(ac.getBean("ziDingYiFactoryBean")); // 打印出来的对象是A对象 (代码new A() 生成的)
    }
}

方法二:@Bean

   @Bean
   public  DataSource getDataSource(){
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        // 这里写个大概 ,简单说明下问题
        driverManagerDataSource.setDriverClassName("com.mysql....");
        return driverManagerDataSource;
    }

方法三:registerSingletion

public class ServiceTest {
    public static void main(String[] args) {
        // 先创建A对象,然后把A对象放到容器内  容器生成的bean 可以@Autowired A对象  
        // 但是 A对象无法 把容器内的bean 作为属性 
        A a = new A();
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
        ac.getBeanFactory().registerSingleton("a",a);
        ac.register(Appconfig.class);
        ac.refresh();
    }
}

调换对象生成位置

public class ServiceTest {
    public static void main(String[] args) {
       
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(Appconfig.class);
        A a = new A();
        IndexService indexService = (IndexService) appContext.getBean("indexService");
		a.setService(indexService );
         // 先 初始化spring 容器 , 缺点是  spring容器初始化时无法使用 A对象
        ac.getBeanFactory().registerSingleton("a",a);
        ac.refresh();

    }
}

你可能感兴趣的:(spring,spring,容器,java)