gpt4 book ai didi

spring - 如何使用 main(String[] args) 方法中的 Autowiring (@Autowired) 引用?

转载 作者:行者123 更新时间:2023-12-03 13:46:07 33 4
gpt4 key购买 nike

我正在尝试使用来自主类的 Autowiring 引用并且面临:

Cannot make a static reference to the non-static field zipCodeLookupService.



这是显而易见的。但我想知道如何处理这种情况。涉及主类时 Autowiring 的正确方法是什么。我的代码如下 -

接口(interface)类
package com.example.services;
public interface IZipCodeLookup {
String retriveCityForZip(String zipCode);
}

服务类
package com.example.services;

import org.springframework.stereotype.Service;

@Service
public class ZipCodeLookupService implements IZipCodeLookup {

@Override
public String retriveCityForZip(String zipCode) {

//below is mock code. actual code does a db lookup using a DAO.
if(zipCode=="94123") return "San Francisco";
return "not found in DB";
}
}

这里是需要服务类的主类
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.example.services.IZipCodeLookup;

@SpringBootApplication
public class AutowireWithMainClassApplication {

@Autowired
IZipCodeLookup zipCodeLookupService;

public static void main(String[] args) {
SpringApplication.run(AutowireWithMainClassApplication.class, args);
String city;
//this will not work, compilation error
//Cannot make a static reference to the non-static field zipCodeLookupService
city=zipCodeLookupService.retriveCityForZip(args[0]);

System.out.println("city for zipcode " + args[0] + " is " +city);
}
}

有人可以建议 - 在涉及主类时如何或使用 Autowiring 的正确方法是什么。

(因为将 Autowired 引用设为静态无论如何都不起作用)
AutowireWithMainClassApplication类,更改为 -
@Autowired
static IZipCodeLookup zipCodeLookupService;

throw

Exception in thread "main" java.lang.NullPointerException

最佳答案

您可以执行以下操作之一:

  • 使用 @Autowired 中的对象@PostConstruct 方法,在依赖注入(inject)完成后执行,如davidxxx上面解释过
  • 使用 Spring 的 getBean() 在你的 main() 中明确要求 Spring 框架在注入(inject)完成后返回对象:
    public static void main(String[] args) {
    ...
    ConfigurableApplicationContext appContext = SpringApplication.run(StartApplication.class, args);
    IZipCodeLookup service = appContext.getBean(IZipCodeLookup.class);
    ...
    }
  • 使用 Spring 的 CommandLineRunner 组件(在 main 之后运行),它将负责 Autowiring 您的对象:
    @Component
    public class MyRunner implements CommandLineRunner {

    @Autowired
    private IZipCodeLookup service;

    @Override
    public void run(String... args) throws Exception {
    ...
    service.doSomething();
    ...
    }
    }
  • 实现 Spring 的 ApplicationRunner的在你的 main 中运行方法:
    @SpringBootApplication
    public class StartApplication implements ApplicationRunner {

    @Autowired
    private IZipCodeLookup service;

    public static void main(String[] args) {
    ConfigurableApplicationContext appContext = SpringApplication.run(StartApplication.class, args);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
    ...
    service.doSomething();
    ...
    }
    }
  • 关于spring - 如何使用 main(String[] args) 方法中的 Autowiring (@Autowired) 引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46617044/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com