自定义对象放入到spring容器内
前言
最近看了一位大神的教学视频,目前感觉挺有道理的,写个记录吧 ,防止忘记。
了解如何把自定义的对象(或第三方对象) 放到Spring 容器里
涉及的业务场景有:
- spring 整合mybatis、
- 读取配置动态注册多个数据源 循环注册多个DataSource到spring容器内。
FactoryBean 工厂bean
https://blog.csdn.net/zknxx/article/details/79572387
三种方法
- FactoryBean
- @Bean
- 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();
}
}