• springboot注解方式,@Autowire和有参构造和无参构造使用哪个创建对象


    springboot注解方式,@Autowire和有参构造和无参构造使用哪个创建对象

    构造测试条件

    ① application.yml

    ruoyi.name = ruoyi
    ruoyi.age = 12
    
    • 1
    • 2

    ② pojo.Person类

    @Data
    @Component 
    @NoArgsConstructor
    @AllArgsConstructor
    public class Person {
        @Value("${ruoyi.name}")
        private String name;
        @Value("${ruoyi.age}")
        private Integer age;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    ③ 启动类

    @SpringBootApplication
    @Slf4j
    public class Application {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext run = SpringApplication.run(Application.class, args);
    
                log.info("{}",run);
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    第一种 controller

    @RestController
    public class HelloController {
    
        @Autowired
        private Person person;
    
        public HelloController(Person person) {
    
            this.person = new Person("2",2);
        }
    
        public HelloController() {
            person = new Person("1",1);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    测试:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存失败,源站可能有防盗链机制,建议将图片保存下来直接上传上传(imMd5i0e60kO-1667553637221)(springboot注解方式,什么时候使用有参构造什么时候使用无参构造.assets/image-20221104170358430.png)(springboot注解方式,什么时候使用有参构造什么时候使用无参构造.assets/image-20221104170358430.png)]

    第二种 controller

    @RestController
    public class HelloController {
    
        // @Autowired
        private Person person;
    
        public HelloController(Person person) {
    
            this.person = new Person("2",2);
        }
    
        public HelloController() {
            person = new Person("1",1);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    测试:

    在这里插入图片描述

    第三种 controller

    @RestController
    public class HelloController {
    
        // @Autowired
        private Person person;
    
        public HelloController(Person person) {
    
            this.person = new Person("2",2);
        }
    
    //    public HelloController() {
    //        person = new Person("1",1);
    //    }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    测试:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-meG0ZWNY-1667553637222)(springboot注解方式,什么时候使用有参构造什么时候使用无参构造.assets/image-20221104170616000.png)]

    报错了,Spring容器会报错,需要修改@Autowired(required = false)即可,如下修改:

    @RestController
    public class HelloController {
    
        @Autowired
        private Person person;
    
        @Autowired(required = false)
        public HelloController(Person person) {
    
            this.person = new Person("2",2);
        }
    
        @Autowired(required = false)
        public HelloController() {
            person = new Person("1",1);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    测试:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VzmWyadH-1667555315396)(springboot注解方式,什么时候使用有参构造什么时候使用无参构造.assets/image-20221104173545460.png)]

    第五种 controller

    @RestController
    public class HelloController {
    
    //    @Autowired
        private Person person;
    
        @Autowired(required = false)
        public HelloController(Person person) {
            this.person = new Person("2",2);
        }
    
        @Autowired(required = false)
        public HelloController() {
            person = new Person("1",1);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    测试:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SuPBYp9P-1667555315397)(springboot注解方式,什么时候使用有参构造什么时候使用无参构造.assets/image-20221104173652094.png)]

    这样的话,Spring会根据参数个数进行排序,参数个数越多,优先级越高,这样上面的代码就会调用第一个构造函数

    第六种 controller

    @RestController
    public class HelloController {
    
    //    @Autowired
        private Person person;
    
        @Autowired(required = false)
        public HelloController(Person person) {
    
            this.person = new Person("2",2);
        }
    
        // @Autowired(required = false)
        public HelloController() {
            person = new Person("1",1);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    测试:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4sLF5NCO-1667555593574)(springboot注解方式,什么时候使用有参构造什么时候使用无参构造.assets/image-20221104175122524.png)]

    总结:

    1、Spring在实例化对象的时候一旦找到一个它认为合适的构造方法,就会直接实例化对象,不会继续寻找其他构造方法。

    2、@Autowire写在属性上永远第一,

    3、要是没有@Autowire写在属性上,取写在构造方法上的,要是有多个急需要加@Autowired(required = false),参数多的为主

    4、要是都没有,就使用无参构造创建对象

    5、只有有参构造,就使用有参构造创建对象

  • 相关阅读:
    算法设计与分析 SCAU11079 可以移动的石子合并(优先做)
    嵌入式数据库sqlite3
    什么是BDD测试(行为驱动开发测试)?
    JAVA堆中的对象结构
    LeetCode-672. 灯泡开关 Ⅱ【穷举,位运算】
    机器学习运用-民宿价格
    基于 Sealos 的镜像构建能力,快速部署自定义 k8s 集群
    HTTP 长连接和 TCP 长连接有什么区别
    CGMH: Constrained Sentence Generation by Metropolis-Hastings Sampling
    blender光照系统设置
  • 原文地址:https://blog.csdn.net/H_Q_Li/article/details/127693120