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

相关推荐
今天又在摸鱼1 分钟前
Maven
java·maven
老马啸西风4 分钟前
maven 发布到中央仓库常用脚本-02
java·maven
代码的余温4 分钟前
MyBatis集成Logback日志全攻略
java·tomcat·mybatis·logback
一只叫煤球的猫1 小时前
【🤣离谱整活】我写了一篇程序员掉进 Java 异世界的短篇小说
java·后端·程序员
斐波娜娜2 小时前
Maven详解
java·开发语言·maven
Bug退退退1232 小时前
RabbitMQ 高级特性之事务
java·分布式·spring·rabbitmq
程序员秘密基地2 小时前
基于html,css,vue,vscode,idea,,java,springboot,mysql数据库,在线旅游,景点管理系统
java·spring boot·mysql·spring·web3
皮皮林5512 小时前
自从用了CheckStyle插件,代码写的越来越规范了....
java
小码氓2 小时前
Java填充Word模板
java·开发语言·spring·word
会飞的天明2 小时前
Java 导出word 实现饼状图导出--可编辑数据
java·word