自己定义如何实现beanDefinition
第一步:先定义一个需要Spring 注入的类
package com.xiangxue.jack.beanDefinition;
import lombok.Data;
@Data
public class BeanClass {
private String username;
}
第二步:新建一个实现BeanDefinitionRegistoryPostprocessor接口的类
【目的是把定制BeanClass的这个类变成BeanDefinition】
package com.xiangxue.jack.beanDefinition;
import org.springframework.beans.BeansException;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.stereotype.Component;
// 这个是完成BEANDefinition注册的,
@Component
public class BeanDefinitionTest implements BeanDefinitionRegistryPostProcessor {
//新建一个generticBeanDefinition,发现这个情况并且设置他的BeanClass 属性;
//BeanClass这个的属性怎么给她赋值呢?
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
//最后这个BeanClass.class 我们之前定义的类;
genericBeanDefinition.setBeanClass(BeanClass.class);
//
genericBeanDefinition.getConstructorArgumentValues().addGenericArgumentValue(null);
//这个参数的目的是获取到BeanClass中的属性userName,
//进一步给这设置属性值,给class赋值,
MutablePropertyValues propertyValues = genericBeanDefinition.getPropertyValues();
//这个追踪到源码是new PropertyValue(key,value);
propertyValues.addPropertyValue("username","peter");
//注册器中加入这个BeanDefinition
//registry 这个注册器对象可以拿到spring中所有的beanDefinition 对象,
registry.registerBeanDefinition("beanClass",genericBeanDefinition);
//
//这里是一个自定义的扫描器
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry);
scanner.addIncludeFilter(new AnnotationTypeFilter(MyService.class));
scanner.scan("com.xiangxue.jack");
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
首先对于这个BeanDefinition对象我们需要知道的是 到底用的是那个内容
这个属性他是一个key-value 结构,
如果一个类想要实例化,第一步 包装成BeanDefinition
如何把一个类转换成BeanDefinition
- 如果一个类想要实例化,第一步 包装成BeanDefinition
- 把这个BeanDefiniton对象的属性,进行赋值
3.第三步:注册
注册 registry.registerBeanDefinition (beanName,definition)方法
bean实例化的时候会循环这个beanName 这个容器
【为什么要使用这个接口来操作】