第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

spring源碼分析(二)bean的生命周期之bean的擴(kuò)展

標(biāo)簽:
Java

目标:我们学习spring的源码的主要目的: 对bean的扩展

package com.springbeanDemo.config;

import com.springbeanDemo.pojo.Product;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.stereotype.Component;

/**
 * 注释
 *
 * @author sunhao
 * @Date 2021-08-09-20:49
 */
@Component
public class springBeanFactory implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        final GenericBeanDefinition bean = (GenericBeanDefinition) configurableListableBeanFactory.getBeanDefinition("bean1");
        bean.setBeanClass(Bean2.class);
    }
}

1.我们需要实现BeanFactoryPostProcessor接口的postProcessBeanFactory方法 他会有一个 ConfigurableListableBeanFactory类型的参数configurableListableBeanFactory 就是我们常说的spring工厂。

2.这个工厂中存在一个map
💣注意这里说的不是单例池的map
上一篇文章讲到过 在Bean初始化的过程中会把属性都注入到BeanFactoryDefinition对象,然后再把BeanFactoryDefinition对象放入到一个map中,从这里就得到了证实。beanDefinitionMap

public BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
        BeanDefinition bd = (BeanDefinition)this.beanDefinitionMap.get(beanName);
        if (bd == null) {
            if (this.logger.isTraceEnabled()) {
                this.logger.trace("No bean named '" + beanName + "' found in " + this);
            }

            throw new NoSuchBeanDefinitionException(beanName);
        } else {
            return bd;
        }
    }

3.对bean的扩展

final GenericBeanDefinition bean = (GenericBeanDefinition) configurableListableBeanFactory.getBeanDefinition("bean1");
bean.setBeanClass(Bean2.class);

在这里通过名字configurableListableBeanFactory.getBeanDefinition("bean1");去找到这个BeanFactoryDefinition对象然后 这里是重点
bean.setBeanClass(Bean2.class);
他把另外一个类 Bean2.class 放到里面 这时候 Bean1.class就不存在在我们的工厂里面了

package com;

import com.springbeanDemo.config.Config;
import com.springbeanDemo.pojo.Product;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * 注释
 * 验证是不是置换了value  用原来的key还能取到
 * @author sunhao
 * @Date 2021-08-09-20:46
 */
public class Main {
    public static void main(String[] args) {
        final AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);
        System.out.println(ac.getBean(Bean2.class));
        System.out.println(ac.getBean("bean1"));
        System.out.println(ac.getBean(Bean2.class) == ac.getBean("bean1"));
    }
}

请记住这里的ac.getBean(“bean1”)会产生疑惑 他取出来的是Bean2.class
我们通过ac.getBean(Bean2.class) 和 ac.getBean(“bean1”) 获取到的对象是同一个 都是Bean2.class 这里验证了 bean.setBeanClass(Bean2.class); 只是把beanClass 这个属性换了。他到了创建bean的那一步就会根据Bean2.class反射去寻找类

我们如果想通过ac.getBean("bean2") 获取到这个Bean2.class的话 需要加上
bean.setBeanClassName(“bean2”);

@Component
public class springBeanFactory implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        final GenericBeanDefinition bean = (GenericBeanDefinition) configurableListableBeanFactory.getBeanDefinition("bean1");
        bean.setBeanClass(Bean2.class);
        bean.setBeanClassName("bean2");
    }
}

@Component这个类上加上扫描注解才会生效

总结:

这里还没有到创建对象的那一步,上一篇文章中说过 对BeanFactoryDefinition扩展完成后 他会根据BeanFactoryDefinition中的属性决定是否去立即创建bean
这里可以理解为 他现在更改的是创建bean之前的那个模板
更改后他就会根据更改之后的模板去创建这个bean到单例池map中

點(diǎn)擊查看更多內(nèi)容
1人點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消