[Spring] 字节一面~Spring 如何解决循环依赖问题 以及 @resource 与 @autowire 同时存在时谁生效

文章目录

    • [Spring 如何解决循环依赖问题](#Spring 如何解决循环依赖问题)
    • [`@resource` 与 `@autowire` 同时存在时谁生效](#@resource 与 @autowire 同时存在时谁生效)

Spring 如何解决循环依赖问题

Spring在实例化一个bean的时候,是首先递归实例化其所依赖的所有bean,直到某个bean没有依赖其他bean,此时就会将该实例返回,然后反递归的将获取到的bean设置为各个上层bean的属性的。

通俗地说,就是设置两个池子:一个成品池子,一个半成品池子。能解决循环依赖的前提是:spring开启了allowCircularReferences,那么一个正在被创建的bean才会被放在半成品池子里。在注入bean,向容器获取bean的时候,优先向成品池子要,要不到,再去向半成品池子要。

@resource 与 @autowire 同时存在时谁生效

java 复制代码
public class AutowireResourceTest {

    public static void main(String[] args) {
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        // bean 的定义(class,scope,初始化,销毁)

        // 把 Config 类交给spring容器管理
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(Config.class)
            .setScope("singleton")
            .getBeanDefinition();

        beanFactory.registerBeanDefinition("config", beanDefinition);
        // 给 BeanFactory 添加一些常用的后置处理器
        AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);
        beanFactory.getBeansOfType(BeanFactoryPostProcessor.class)
            .values()
            .forEach(i -> i.postProcessBeanFactory(beanFactory));
        beanFactory.getBeansOfType(BeanPostProcessor.class)
            .values()
            .forEach(beanFactory::addBeanPostProcessor);
        System.out.println(beanFactory.getBean(Bean1.class).getInner());

    }

    @Configuration
    static class Config {
        @Bean
        public Bean3 bean3() {
            return new Bean3();
        }
        @Bean
        public Bean4 bean4() {
            return new Bean4();
        }
        @Bean
        public Bean1 bean1() {
            return new Bean1();
        }
    }
    static class Bean1 {
        @Autowired
        @Resource(name = "bean4")
        private Inner bean3;
        private Inner getInner() {
            return bean3;
        }
    }

    interface Inner {}
    static class Bean3 implements Inner {
            Bean3() {
                System.out.println(">>>>>>>>>.3");
            }
    }
    static class Bean4 implements Inner {
        Bean4() {
            System.out.println(">>>>>>>>>>>>>.4");
        }
    }
}

autowired 与 resource(name='xx') 同时存在时,注入了autowired 的bean。

这跟bean的处理顺序有关,在源码中可以找个两个bean的order的大小关系,当然我们可以手动修改bean的比较器来决定哪个bean起作用。

但是在实际应用中,一般不会同时使用autowired 和 resource , 如果有,那写的那个人肯定第二天不用来上班了。

相关推荐
CQU_JIAKE10 分钟前
11.13[体系结构】指标,五级流水线,八级流水线,虚实地址思考
后端
Flynn Liang27 分钟前
可观测性与成本治理:一次对话的 17 个观测点
java·langchain·可观测性·micrometer·langchain4j·token 成本·llm 监控
金銀銅鐵1 小时前
带您看懂字节码指令(三):同一行加法,为什么有四种指令
java·jvm
panbook2 小时前
从0到1实现一个分布式时序数据库(三):主从复制、故障检测与切换
后端
上线再说2 小时前
图片从 8.2MB 压到 296KB:我把小程序图片链路的账单拆了一遍
后端
dpharness2 小时前
我原以为 MCP 装完就能用,直到工具列表是空的
后端
dpharness2 小时前
153 个 MCP 服务,我把工具数一个个数了一遍
后端
文丑颜不良啊5 小时前
LeetCode2821~2840题目解析
java·leetcode
打工仔折腾 AI5 小时前
Changedetection.io 网页变动监控:Docker 部署、通知配置与公网暴露实践
运维·人工智能·后端·python·docker·容器·性能优化