Spring的循环依赖

Spring的循环依赖

Bean的产生

class—>beanDefinition(bean的各种信息,1.scope 2.isLazy 3.beanClass…)—>实例化(得到一个对象)—>填充属性—>BeanNameAware(设置bean名字)—>InitializingBean(初始化bean)—>单例池Map<beanName,Object>

被Spring管理的对象叫bean user属性是有值的

自己new出来的对象只能叫对象 user属性是没有值的

Bean的生命周期

User实体类

package com.yyq.pojo;

import org.springframework.stereotype.Component;

@Component
public class User {
}

Userservice

package com.yyq.service;

import com.yyq.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserService {
    @Autowired
    private User user;
}

AppConfig

package com.yyq;

import org.springframework.context.annotation.ComponentScan;

@ComponentScan("com.yyq")
public class AppConfig {
}

MyBeanFactoryPostProcessor BeanFactory的后置处理器(这里可以拿到BeanDefinition)

package com.yyq.processor;

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;

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        GenericBeanDefinition userServiceBeanDefinition = //Spring内部用GenericBeanDefinition
                (GenericBeanDefinition)configurableListableBeanFactory.getBeanDefinition("userService");
        System.out.println(userServiceBeanDefinition.getBeanClass());
    }
}

Test

package com.yyq;

import com.yyq.service.UserService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        UserService bean = applicationContext.getBean(UserService.class);//bean
        UserService userService = new UserService();//对象
    }
}

这里在MyBeanFactoryPostProcessor拿到了UserService

image-20210316214122249

Bean的后置处理器(BeanPostProcessor用来加工bean)---->填充属性—>BeanNameAware(设置bean名字)—>InitializingBean(初始化bean)—>单例池Map<beanName,Object>

BeanFactory的后置处理器(BeanFactoryPostProcessor)—>启动扫描包—>放在beanDefinitionMap—>BeanFactoryPostProcessor---->BeanFactory(1.beanDefinitionMap 2. singletonObjects 3. beanDefinitionName 4. factoryBeanObjectCache 5.aliasMap 6.BeanPostProcessor)

循环依赖结论

spring容器启动–>scan扫描包–>将扫描的信息放在beandefinitionMap中–>spring对beandefinitionMap进行一次扫描(判断是否单列,是否懒加载,名字是否符合)–>可以通过beanfactorypostprocessor修改bean工厂

判断X是否在单例池中–>没有的话开始实例化X–>推断X的构造方法–>判断X是否提前暴露–>没有提前暴露–>生成objectfactory暴露到二级缓存中–>属性填充–>发现依赖Y–>开始走Y的生命周期–>Y做属性填充的时候需要依赖X–>又走X的生命周期–>X存在objectfactory–>将X的objectfactory注入,完成依赖注入–>通过beanpostprocessor我们可以修改objectory即修改bean

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值