1.定义Student对象
@Data
public class Student {
private String name;
public Student() {
}
public Student(String name) {
this.name = name;
}
}
2. 实现BeanFactoryPostProcessor
接口
public class SupplierBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// 从bean工厂获取student定义信息
BeanDefinition user = beanFactory.getBeanDefinition("student");
// BeanDefinition 强转为其实现子类AbstractBeanDefinition
AbstractBeanDefinition abstractBeanDefinition = (AbstractBeanDefinition) user;
// 函数式 new Student对象,并设置到bean定义信息中
abstractBeanDefinition.setInstanceSupplier(() -> new Student("wukong"));
// 设置Studnet类型
abstractBeanDefinition.setBeanClass(Student.class);
}
}
3. 定义supplier.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--注入bean定义-->
<bean id="student" class="com.cosmos.supplier.Student"></bean>
<bean id="supplierBFPP" class="com.cosmos.supplier.SupplierBeanFactoryPostProcessor"></bean>
</beans>
测试:
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("supplier.xml");
Student student = context.getBean(Student.class);
System.out.println(student.getUsername());
}
}
result:
>Test.main()
wukong
基于supplier函数式接口设置bean定义信息流程:
创建bean实例对象时,从bean定义信息中获取supplier策略;生成具体的实例流程: