注入思路
- 获取Spring的 BeanFactory
- BeanFactory提供了一个注册BeanDefinition的方法
- 一个普通对象如何转换成BeanDefinition?通过Spring提供支持的BeanDefinitionBuilder.genericBeanDefinition(A.class),生成一个BeanDefinition
- 生成后的BeanDefinition可以通过addPropertyValue设置bean的值
如何获取到BeanFactory
- 实现 ApplicationContextAware 接口(类上需要@Component 才能正常获取到 ApplicationContext,还暂未想清楚其中缘由,欢迎各位懂的大牛留言指导)
- 通过applicationContext.getAutowireCapableBeanFactory() 获取到 DefaultListableBeanFactory
/**
* 待注入到IOC容器的对象
*
* @author xx@gogpay.cn
* @date 2021/3/26 14:40
*/
public class A {
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
/**
* 测试方法
*
* @author renguangqian@gogpay.cn
* @date 2021/3/26 14:38
*/
@Component
public class Test implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// 获取beanFactory
DefaultListableBeanFactory autowireCapableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
// 使用BeanDefinitionBuilder 构造一个beanDefinition
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(A.class);
// 设置Bean中的对象属性
beanDefinitionBuilder.addPropertyValue("name", "张四");
beanDefinitionBuilder.addPropertyValue("sex", "男");
// 通过上下文拿到的BeanFactory 将BeanDefinition注册
autowireCapableBeanFactory.registerBeanDefinition("aService", beanDefinitionBuilder.getBeanDefinition());
// 从Spring中获取Bean(验证是否成功)
A bean = autowireCapableBeanFactory.getBean(A.class);
// 打印对象属性
System.out.println(bean.getName());
}
}