Spring Bean 实例化方式
程序员文章站
2022-05-21 19:18:12
...
1. InstanceSupplier方式
源码
//createBeanInstance 方法下
Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
if (instanceSupplier != null) {
return obtainFromSupplier(instanceSupplier, beanName);
}
protected BeanWrapper obtainFromSupplier(Supplier<?> instanceSupplier, String beanName) {
Object instance;
String outerBean = this.currentlyCreatedBean.get();
this.currentlyCreatedBean.set(beanName);
try {
instance = instanceSupplier.get();
}
finally {
if (outerBean != null) {
this.currentlyCreatedBean.set(outerBean);
}
else {
this.currentlyCreatedBean.remove();
}
}
if (instance == null) {
instance = new NullBean();
}
BeanWrapper bw = new BeanWrapperImpl(instance);
initBeanWrapper(bw);
return bw;
}
所以只需要为mbd属性instanceSupplier添加值既可。实现方式如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="supplierUser" class="com.self.bean.initialization.creation.method.supplier.SupplierUser"/>
<bean class="com.self.bean.initialization.creation.method.supplier.SupplierBeanFactoryPostProcessor"/>
</beans>
public class SupplierUser {
private String name;
public SupplierUser() {
}
public SupplierUser(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "SupplierUser{" +
"name='" + name + '\'' +
'}';
}
}
public class CreateSupplier {
public static SupplierUser createSupplierUser() {
return new SupplierUser("zhangsan");
}
}
public class SupplierBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition supplierUser = beanFactory.getBeanDefinition("supplierUser");
GenericBeanDefinition genericBeanDefinition = (GenericBeanDefinition) supplierUser;
genericBeanDefinition.setInstanceSupplier(CreateSupplier::createSupplierUser);
genericBeanDefinition.setBeanClass(SupplierUser.class);
}
}
public class SupplierCreateTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("creation.method.supplier.xml");
SupplierUser supplierUser = (SupplierUser) classPathXmlApplicationContext.getBean("supplierUser");
System.out.println(supplierUser.getName());
}
}