条条大路通罗马
前提:怕读者没有头绪,请在https://blog.csdn.net/dong19891210/article/details/105697175的情况下看
Spring bean有以下几种注册方式:
1. 通过GenericBeanDefinition注册
示例代码:
消息辅助类
public class Message {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public void print() {
System.out.println("消息是: " + message);
}
}
注册测试类:
/**
*
* @author dgm
* @describe "GenericBeanDefinition注册bean定义"
* @date 2020年4月27日
*/
public class GenericBeanDefinitionExample {
public static void main (String[] args) {
DefaultListableBeanFactory context =
new DefaultListableBeanFactory();
//在此构造bean定义
GenericBeanDefinition gbd = new GenericBeanDefinition();
gbd.setBeanClass(Message.class);
//
MutablePropertyValues mpv = new MutablePropertyValues();
mpv.add("message", "this is a bean");
//注册到环境上下文
context.registerBeanDefinition("myBean", gbd);
Message bean = context.getBean(Message.class);
bean.print();
Message myBean = (Message) context.getBean("myBean");
myBean.print();
}
}
结果:
2. 通过BeanDefinitionBuilder注册
/**
*
* @author dgm
* @describe ""
* @date 2020年4月16日
*/
public class BeanDefinitionBuilderExample {
public static void main (String[] args) {
DefaultListableBeanFactory context =
new DefaultListableBeanFactory();
//用到了构建者模式
BeanDefinitionBuilder b =
BeanDefinitionBuilder.rootBeanDefinition(Message.class)
.addPropertyValue("message", "this is a bean");
context.registerBeanDefinition("myBean", b.getBeanDefinition());
Message bean = context.getBean(Message.class);
bean.print();
Message myBean = (Message) context.getBean("myBean");
myBean.print();
}
}
效果同第一种情况,只是用的是BeanDefinitionBuilder模式
3. 通过BeanFactoryPostProcessor
public class MessageBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
// TODO Auto-generated method stub
GenericBeanDefinition gbd = new GenericBeanDefinition();
gbd.setBeanClass(Message.class);
MutablePropertyValues mpv = new MutablePropertyValues();
mpv.add("message", "this is a BeanFactoryPostProcessor bean");
gbd.setPropertyValues(mpv);
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition(
"myBean", gbd);
}
}
配置类
@Configuration
public class MyConfig {
@Bean
MessageBeanFactoryPostProcessor messageConfigBean () {
return new MessageBeanFactoryP