Spring手动构建BeanDefinition的几种方法
- GenericBeanDefinition
- RootBeanDefinition
- ChildBeanDefinition
- BeanDefinitionBuilder
GenericBeanDefinition
@Data
public class Student {String name;int age;
}
public void test() {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();GenericBeanDefinition gBean = new GenericBeanDefinition();//设置beangBean .setBeanClass(Student.class);//设置属性MutablePropertyValues propertys=new MutablePropertyValues();propertys.add("name","luxifa").add("age",25);gBean .setPropertyValues(mp); // 注册beancontext.registerBeanDefinition("bean1", gBean );
}
GenericBeanDefinition也可以继承
public void test() {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();GenericBeanDefinition definition1 = new GenericBeanDefinition();//设置beandefinition1.setBeanClass(Student.class);//设置属性MutablePropertyValues propertys=new MutablePropertyValues();propertys.add("name","luxifa").add("age",25);definition1.setPropertyValues(mp); // 注册beancontext.registerBeanDefinition("gBean1", definition1);GenericBeanDefinition definition2 = new GenericBeanDefinition();definition2.setParentName("gBean1");// definition2 的属性继承了 definition1context.registerBeanDefinition("gBean2", definition2);context.refresh();Student student1 = (Student) context.getBean("gBean1");Student bean2 = (Student) context.getBean("gBean2");
}
RootBeanDefinition
RootBeanDefinition不能有父节点
public void test() {// RootBeanDefinitionRootBeanDefinition definition = new RootBeanDefinition();definition.setBeanClass(Student.class);definition.getPropertyValues().add("name", "luxifa");definition.getPropertyValues().add("age", 25);context.registerBeanDefinition("bean1", definition);// childChildBeanDefinition definition2 = new ChildBeanDefinition("bean1");context.registerBeanDefinition("bean2", definition2);// 刷新context.refresh();Bean bean1 = (Bean) context.getBean("bean1");Bean bean2 = (Bean) context.getBean("bean2");System.out.println(bean1==bean2);
}
ChildBeanDefinition
ChildBeanDefinition必须有父节点
public void test() {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();// RootBeanDefinitionRootBeanDefinition definition = new RootBeanDefinition();definition.setBeanClass(Student.class);definition.getPropertyValues().add("name", "luxifa");definition.getPropertyValues().add("age", 25);context.registerBeanDefinition("rBean1", definition);// ChildBeanDefinitionChildBeanDefinition definition2 = new ChildBeanDefinition("rBean1");context.registerBeanDefinition("rBean2", definition2);
}
BeanDefinitionBuilder
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Student.class);
//懒加载,调用get("beanname")方法时才实例化
builder.setLazyInit(true);
// builder.getBeanDefinition() 其实是一个 GenericBeanDefinition
context.registerBeanDefinition("hBean", builder.getBeanDefinition());
参考博客:https://juejin.cn/post/6844904118595616782