【第五天】如何让自己定义类,自动完成spring 实例化如何实现beanDefinition

自己定义如何实现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 {

    }
}

图3

在这里插入图片描述
首先对于这个BeanDefinition对象我们需要知道的是 到底用的是那个内容
图示3
这个属性他是一个key-value 结构,

如果一个类想要实例化,第一步 包装成BeanDefinition

如何把一个类转换成BeanDefinition

  1. 如果一个类想要实例化,第一步 包装成BeanDefinition
  2. 把这个BeanDefiniton对象的属性,进行赋值
    3.第三步:注册
    注册 registry.registerBeanDefinition (beanName,definition)方法
    bean实例化的时候会循环这个beanName 这个容器
    在这里插入图片描述
    【为什么要使用这个接口来操作】
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值