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

前言

最近看了一位大神的教学视频,目前感觉挺有道理的,写个记录吧 ,防止忘记。
了解如何把自定义的对象(或第三方对象) 放到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();

    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值