重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Spring创建对象的主要方式有
发展壮大离不开广大客户长期以来的信赖与支持,我们将始终秉承“诚信为本、服务至上”的服务理念,坚持“二合一”的优良服务模式,真诚服务每家企业,认真做好每个细节,不断完善自我,成就企业,实现共赢。行业涉及砂岩浮雕等,在网站建设、营销型网站建设、WAP手机网站、VI设计、软件开发等项目上具有丰富的设计经验。通过自定义BeanPostProcessor,生成代理对象InstantiationAwareBeanPostProcessor
createBean() ->resolveBeforeInstantiation()
通过supplier创建对象
createBean() ->doCreateBean() ->createBeanInstance() ->obtainFromSupplier()
通过FactoryMethod创建对象
createBean() ->doCreateBean() ->createBeanInstance() ->instantiateUsingFactoryMethod()
通过反射创建对象
createBean() ->doCreateBean() ->createBeanInstance() ->instantiateBean()
通过FactoryBean创建对象
本文介绍下最后一种,如何通过supplier创建Bean(保姆级教程,建议收藏食用(。・ω・。)ノ)
创建测试所需文件 User.javapublic class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(){
}
public User(String name) {
this.name = name;
}
}
CreateSupplier.javapublic class CreateSupplier {
public static User createUser() {
return new User("aqin");
}
}
SupplierBeanFactoryPostProcessor.javapublic class SupplierBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition("user");
GenericBeanDefinition genericBeanDefinition = (GenericBeanDefinition) beanDefinition;
genericBeanDefinition.setInstanceSupplier(CreateSupplier::createUser);
genericBeanDefinition.setBeanClass(User.class);
}
}
supplier.xml
TestSupplier.javapublic class TestSupplier {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("supplier.xml");
User user = applicationContext.getBean(User.class);
System.out.println(user.getName());
}
}
测试效果Debug由于是测试创建Bean,我们需要在doCreateBean()上打个断点,启动debug,执行到断点位置,如下图:
进入doCreateBean(),下一步到instanceWrapper = createBeanInstance(beanName, mbd, args);,进入createBeanInstance()方法中
进入createBeanInstance()方法后,下一步到Supplier>instanceSupplier = mbd.getInstanceSupplier();这里是判断当前beanDefinition中是否包含实例供应器的
继续下一步,我们会发现instanceSupplier=null,咦?……不应该呀?
不用着急,我们仔细看上图中红框框圈住的内容,有一个是beanName,此时,beanName是"supplierBeanFactoryPostProcessor",并非我们要创建的"user"
所以我们直接点击下图中的Resume Program再次进入之前的断点即可
点击上图中的绿三角,就会再次停在一开始我们打断点的位置,如下图:
此时可以看到,当前处理对象的beanName为"user",继续下一步,直到再次执行到Supplier>instanceSupplier = mbd.getInstanceSupplier()
进入getInstanceSupplier(),可以发现instanceWrapper已经不是null叻
再向下执行一步,由于instanceSupplier已经有了值,所以会进入if的逻辑,通过obtainFromSupplier()方法返回已获取到的对象
obtainFromSupplier()从给定“供应商”处,获取Bean实例
然后包装一下,再进行初始化
完成(。・ω・。)ノ
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧