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

相关推荐
你的人类朋友13 小时前
说说签名与验签
后端
databook13 小时前
Manim实现脉冲闪烁特效
后端·python·动效
RainbowSea14 小时前
12. LangChain4j + 向量数据库操作详细说明
java·langchain·ai编程
RainbowSea14 小时前
11. LangChain4j + Tools(Function Calling)的使用详细说明
java·langchain·ai编程
canonical_entropy17 小时前
AI时代,我们还需要低代码吗?—— 一场关于模型、演化与软件未来的深度问答
后端·低代码·aigc
颜如玉17 小时前
HikariCP:Dead code elimination优化
后端·性能优化·源码
考虑考虑18 小时前
Jpa使用union all
java·spring boot·后端
用户37215742613518 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
bobz96519 小时前
virtio vs vfio
后端
浮游本尊19 小时前
Java学习第22天 - 云原生与容器化
java