无法自动连线

时间:2018-08-18 14:31:39

标签: java spring-boot

使用Spring Initializer创建一个简单的Spring引导。我仅在可用选项下选择DevTools。

创建项目后,无需对其进行任何更改,就可以正常运行该程序。

现在,当我尝试在项目中进行一些自动装配时,它根本不起作用。我不明白一直在这里寻找所有以前的问题的解决方案,但没有解决方案,而且我在我的情况下所做的工作没有什么复杂,如下所示。请告知我所缺少的。

@SpringBootApplication
public class DemoApplication {

    //  @Autowired
    //  private static Maker maker; // Stopped using this cos I wanted to check if the autowiring is not working in this class only or anywhere. Turns out it is anywhere. 

        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
            Maker maker = new Maker();
            maker.printName(); // Fails cos of ServiceHelper Autowiring 
        }
    }


@Service
public class Maker {

    @Autowired
    private ServiceHelper serviceHelper;

    public void printName(){
        System.out.println("This is from the method body itself.");
        System.out.println("Auto wiring works cos I got this -> " + serviceHelper.help());
    }
}

@Component
public class ServiceHelper {
    public String help(){
        return "...FROM HELPER...";
    }
}

StackTrace

  

线程“ restartedMain”中的异常   java.lang.reflect.InvocationTargetException在   sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)位于   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:497)在   org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)   由以下原因引起:java.lang.NullPointerException   com.example.demo.services.Maker.printName(Maker.java:15)在   com.example.demo.DemoApplication.main(DemoApplication.java:17)... 5   更多

3 个答案:

答案 0 :(得分:1)

您创建了一个实例,它的ServiceHelper不会被Spring自动连接:

Maker maker = new Maker();

您可以通过ApplicationContext访问Bean:

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        ApplicationContext cts = SpringApplication.run(DemoApplication.class, args);
        Maker maker = ctx.getBean(Maker.class);
        maker.printName();
    }
}

答案 1 :(得分:1)

如果使用new关键字创建任何bean时,该bean不会添加到Spring Application Context中,这是@Autowire静态bean的一种方法

@SpringBootApplication
public class DemoApplication {

    @Autowired
    private static Maker maker; 

    @Autowired
    private Maker tMaker;

    @PostConstruct
    public void init() {
    DemoApplication.maker = tMaker;
}

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
        maker.printName();  
    }
}

或者您可以使用Autowire来进行ConstructorMaker的实例在创建DemoApplication时作为构造函数的参数注入

@Autowired
public DemoApplication(Maker maker) {
    DemoApplication.maker = maker;
    }

或者您可以在setter方法上使用@Autowired,创建Maker时将以DemoApplication的实例调用setter方法

@Autowired
public void setMaker(Maker maker) {
        DemoApplication.maker = maker
}

答案 2 :(得分:0)

当您使用new Maker()时,您没有使用为您创建的Spring Bean,结果是您的对象未初始化,因为没有注入依赖项。

您需要获取Spring框架创建的bean,就像我在下面所做的那样,因为您不能直接自动绑定静态字段:

@SpringBootApplication
public class DemoApplication {

    private static Maker maker;

    @Autowired
    public void setMaker(Maker maker) {
        DemoApplication.maker = maker;
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
        maker.printName();
    }
}