spring Bean创建流程及扩展点


title: “spring Bean创建流程及扩展点”
date: 2019-09-26
tags: [“spring”]
categories: 后台


springBean创建流程

spring bean流程

扩展点

ImportBeanDefinitionRegistrar 与ImportSelector

实现接口可以添加自定义的beanDefinition,例:

@Component
public class RpcClientSelector implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        Map<String, Object> map = importingClassMetadata.getAnnotationAttributes(EnableRpcClient.class.getName());
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(RpcScanner.class);
        beanDefinitionBuilder.addPropertyValue("basePackage", map.get("basePackage"));
        registry.registerBeanDefinition(RpcScanner.class.getName(), beanDefinitionBuilder.getBeanDefinition());
    }
}

BeanDefinitionBuilder.rootBeanDefinition(clazz); 如果clazz 实现了FactoryBean那么创建的bean 的类型不是clazz本身,而是getObject() 方法返回的对象类型

@Component
public class RpcClientSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        Set<String> strings = importingClassMetadata.getMetaAnnotationTypes(RpcClient.class.getName());
        Set<String> strings1 = importingClassMetadata.getAnnotationTypes();
        return new String[]{"com.jianganwei.rpcclient.selector.RpcScanner"};
    }
}

BeanFactoryPostProcessor

添加修改bean

@Component
public class MyConfigBean implements BeanFactoryPostProcessor {

  @Override
  public void postProcessBeanFactory (
            ConfigurableListableBeanFactory beanFactory)
            throws BeansException {

      GenericBeanDefinition bd = new GenericBeanDefinition();
      bd.setBeanClass(MyBean.class);
      bd.getPropertyValues().add("strProp", "my string property");

      ((DefaultListableBeanFactory) beanFactory)
                .registerBeanDefinition("myBeanName", bd);
  }
}

BeanPostProcessor

bean的初始化过程(初始化,之前初始化之后)

总结

通过上面的扩展点可以动态修改bean然后注入到代码中,注入动态代理后的bean都是基于这些扩展点完成的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值