[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 , 如果有,那写的那个人肯定第二天不用来上班了。

相关推荐
eternal__day2 分钟前
Spring Cloud 多机部署与负载均衡实战详解
java·spring boot·后端·spring cloud·负载均衡
颜淡慕潇6 分钟前
Redis 实现分布式锁:深入剖析与最佳实践(含Java实现)
java·redis·分布式
Livingbody12 分钟前
whisper 命令行解析【2】
后端
程序员秘密基地12 分钟前
基于vscode,idea,java,html,css,vue,echart,maven,springboot,mysql数据库,在线考试系统
java·vue.js·spring boot·spring·web app
何中应13 分钟前
【设计模式-5】设计模式的总结
java·后端·设计模式
吾日三省吾码31 分钟前
Spring 团队详解:AOT 缓存实践、JSpecify 空指针安全与支持策略升级
java·spring·缓存
小胖同学~33 分钟前
JavaWeb笔记
后端·servlet
风象南1 小时前
SpringBoot的5种日志输出规范策略
java·spring boot·后端
cccc来财1 小时前
Go中的协程并发和并发panic处理
开发语言·后端·golang
咖啡啡不加糖1 小时前
深入理解MySQL死锁:从原理、案例到解决方案
java·数据库·mysql