【问题标题】:Autowired - null pointer [duplicate]自动连线 - 空指针 [重复]
【发布时间】:2021-01-13 09:36:24
【问题描述】:

我正在尝试了解 Autowired 如何与非常基本的示例一起工作......当涉及到典型的控制器/服务/dao 时,它按预期工作,但是当我想创建其他东西时,我一直在为一些 NullPointers 苦苦挣扎。 ..

我有两个课程:汽车、发动机和启动课程。

    @Getter
    @Setter
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    @Component
    public class Car {
        private int power;
        @Autowired
        Engine engine;

        public String showEngineName() {
            return engine.getName();
        }
    }
    
    @Getter
    @Setter
    @Component
    public class Engine {
        private String name = "super engine";
    
        public String getName() {
            return name;
        }
    }


    @SpringBootApplication
    public class EduApplication {
    
        public static void main(String[] args) {
            Car car = new Car();
            String engineName = car.showEngineName();
            System.out.println(engineName);
            SpringApplication.run(EduApplication.class, args);
    
        }
    
    }

当我启动应用程序时,汽车已初始化,但里面的引擎为空... 有人可以向我解释为什么吗?不应该有一个名字叫“超级引擎”的引擎吗?

问候!

【问题讨论】:

    标签: java spring inversion-of-control autowired


    【解决方案1】:

    你得到NullPointerException,因为你指的是Car实例,它是由你而不是Spring显式创建的,因此没有对该对象执行依赖注入,engine字段保持为空。

    【讨论】:

    • 那么如何通过spring创建对象呢?
    • 好的,我通过 .getBean(Car.class) 创建了一个对象,但你能告诉我这是否是使用 spring 创建对象的唯一优雅方式吗?
    • 不是你创造的,是 Spring 创造的。您通过使用 @Component 注释来注释 Car 类来指示 Spring 这样做。您可以像您一样在ApplicationContext 上使用getBean 方法访问它,或者在类字段或方法上使用@Autowired,这将导致Spring 为您注入此对象。两种方式都同样正确,并提供完全相同的 Car 实例。
    猜你喜欢
    • 2017-10-22
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2011-03-26
    • 2011-12-21
    • 2014-02-04
    相关资源
    最近更新 更多