SpringBean动态注册BeanDefinition(三)

SpringBean动态注册BeanDefinition(三)

动态注册Bean意义

1.通常在项目开发中将Bean注入IOC方式:在XML中定义、基于注解@Component、@Bean、@Configuration,项目Start时会扫描注册到IOC容器中。
2.如果在启动后,通过动态注册创建Bean,将Bean增强等,如何实现?
3.动态生成Bean替换数据源实现数据链接切换。

Bean注册和实例化

在开始讲述之前,得明白Bean注册和实例化两个概念。
1.注册:IOC容器通过BeanDefinition 将Bean 依赖关系注册到beanDefinitionMap中,BeanDefinition是一个接口,包含Bean Scope、lazy懒加载等 后续会讲,这里只是依赖关系注册并非直接可以使用Bean。

2.实例化:Bean在注册之后,Bean开始生命周期,通过GetBean()方法对beanDefinitionMap中Bean进行初始化生命周期开始,将创建好的Bean放入单列池。

核心接口

BeanDefinition接口
1. 继承关系

继承关系

2.AttributeAccessor接口:定义用于附加和访问元数据的通用协定的接口简单说Bean属性值DDL,可以是任意对象。
public interface AttributeAccessor {
 
	//设置属性的值
	void setAttribute(String name, Object value);
 
	//获得指定属性名称的值
	Object getAttribute(String name);
 
	//删除指定的属性
	Object removeAttribute(String name);
 
  //判断指定属性是否存在
	boolean hasAttribute(String name);
 
	//获取所有属性
	String[] attributeNames();
}
3.BeanMetadataElement接口:获取Bean来源
public interface BeanMetadataElement {
   // 获取Bean来源
	@Nullable
	default Object getSource() {
		return null;
	}

}
4.BeanDefinition 接口:提供Scope单列or原型、Bean角色、父类BeanDefinition XML中的bean parent=""等
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {

// Socpe:单例\原型
 String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
 String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;

// Bean角色
 int ROLE_APPLICATION = 0;  //用户自己定义的 Bean
 int ROLE_SUPPORT = 1;  //来源于配置文件的 Bean
 int ROLE_INFRASTRUCTURE = 2;//Spring 内部的 Bean

//获取超类BeanDefinition XML中的 <bean parent="">
 void setParentName(@Nullable String parentName);
 //获取超类BeanDefinition名称
 @Nullable
 String getParentName();

//设置BeanClassName。XML 中的 <bean class="">
 void setBeanClassName(@Nullable String beanClassName);
  //获取BeanClassName全路径
 @Nullable
 String getBeanClassName();

// 设置Bean Scope 作用域 XML中的 <bean scope=""> 配置。
 void setScope(@Nullable String scope);
  //获取Bean作用域
 @Nullable
 String getScope();

// 设置 Bean 是否懒加载(默认false,立马加载)XML 中的 <bean lazy-init="">
 void setLazyInit(boolean lazyInit);
  //获取 懒加载值 false:立马加载 true 延迟加载
 boolean isLazyInit();

//设置Bean 的依赖对象  XML中的 <bean depends-on="">
 void setDependsOn(@Nullable String... dependsOn);
  //获取依赖对象
 @Nullable
 String[] getDependsOn();

//设置Bean是否是自动装配  默认为 true XML中的 <bean autowire-candidate="">
 void setAutowireCandidate(boolean autowireCandidate);
  //获取Bean自动装配值
 boolean isAutowireCandidate();

//如果找到了多个可注入bean,那么则选择被Primary标记的bean/获取当前 Bean 是否为首选的 Bean  XML中的 <bean primary="">
 void setPrimary(boolean primary);
 boolean isPrimary();

// 设置 FactoryBean 的名字  XML中的<bean factory-bean="">
 void setFactoryBeanName(@Nullable String factoryBeanName);
 @Nullable
 String getFactoryBeanName();

//设置 FactoryMethod 的名字,可以是某个实例的方法(和factoryBean配合使用)也可以是静态方法。 XML 中的<bean factory-method=""> 
 void setFactoryMethodName(@Nullable String factoryMethodName);
 @Nullable
 String getFactoryMethodName();

//返回该 Bean 构造方法的参数值
 ConstructorArgumentValues getConstructorArgumentValues();

//判断 getConstructorArgumentValues 是否是空对象。
 default boolean hasConstructorArgumentValues() {
  return !getConstructorArgumentValues().isEmpty();
 }

//获取普通属性的集合
 MutablePropertyValues getPropertyValues();

//判断 getPropertyValues 是否为空对象
 default boolean hasPropertyValues() {
  return !getPropertyValues().isEmpty();
 }

// 设置 Bean 的初始化方法 XML中的<bean init-method="">
 void setInitMethodName(@Nullable String initMethodName);
  //获取Bean初始化方法名称
 @Nullable
 String getInitMethodName();

// 设置 Bean 的销毁方法  XML中的<bean destroy-method="">
 void setDestroyMethodName(@Nullable String destroyMethodName);
 @Nullable
 String getDestroyMethodName();

//设置 Bean的角色
 void setRole(int role);
 int getRole();

//设置 Bean 的描述
 void setDescription(@Nullable String description);
 @Nullable
 String getDescription();

//用来解析一个Bean对应的类型上的各种信息,比如泛型
 ResolvableType getResolvableType();

//是否为单例
 boolean isSingleton();

// 是否为原型
 boolean isPrototype();

//是否抽象  XML 中的<bean abstract="true">
 boolean isAbstract();

//返回定义 Bean 的资源描述
 @Nullable
 String getResourceDescription();

// 如果当前 Bean
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值