【问题标题】:How can I start a Main-Class in Spring-Boot?如何在 Spring-Boot 中启动主类?
【发布时间】:2018-08-26 09:23:52
【问题描述】:

我想执行一个非常简单的示例来解释 Spring-Boot 中的 IoC 概念。

为此,我创建了一个 Bean,它将 @Autowired 连接到一个主类,该主类有一个对 bean 执行某些操作的方法。

豆子:

主要:

@Component
public class MyMain {

    @Autowired
    private MyBean bean1;

    public void usingTheBean()
    {
        bean1.setName("Thats my first bean!");
        bean1.setAttribute("And thats just an attribute");

        System.out.println(bean1);
    }
    public static void main(String[] args) {
        //MyMain main = new MyMain();
        //main.usingTheBean();
    }
}

我的 SpringBootApplication:

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
        MyMain main = new MyMain();
        main.usingTheBean();
    }
}

如何开始主课?没有得到

java.lang.NullPointerException 

对于@Autowired Bean“MyBean”在主?

我知道 NullPointer-Exception 的原因是我使用“new”关键字创建了主类。

但问题更多地集中在“如何使用 spring-boot 启动主类”的问题

【问题讨论】:

  • 为什么你不能把你的 MyMain 类作为 spring boot 启动类。
  • 我怎样才能调用“usingTheBean”-Method?
  • 您可以在这篇文章中查看我关于如何创建基本 Spring Boot 应用程序的答案:stackoverflow.com/questions/43447798/…
  • @VNT 这个例子使用了 RestController-Annotation。这意味着,我们想要完成稍微不同的事情。但仍然感谢您的链接,我确实帮助了我!
  • 顺便说一句,这就是为什么我总是推荐基于构造函数的依赖注入而不是单独注释每个成员的原因,它让 Spring 何时会或不会进行依赖注入变得非常清楚。如果您自己调用构造函数,则需要提供依赖项

标签: java spring spring-boot


【解决方案1】:

通常,您不希望自己直接使用上下文来创建 bean。您应该让上下文初始化,然后使用自动装配的 bean。很可能,您处理这个问题的方式与 Spring 解决问题的方式非常不同。

您应该看看以下示例:

  • 使用 CommandLineRunner 接口(参见here)或
  • 使用 InitializingBean 接口(参见here

或者,您可以通过配置解决此问题:

@Configuration
public class MyConfig {

  @Bean
  public MyBean myBean() {
    MyBean bean = new MyBean();
    bean.setName("...");
    bean.setAttribute("...");
    return bean;
  }
}

然后你可以简单地使用

@Autowired
MyBean myBean;

自动装配它。

如果在您的情况下可能的话,另一种选择是从配置文件(例如 application.properties)中注入值:

@Component
public class MyBean {

  @Value("${my.config.value}")
  private String name;

  @Value("${my.config.attribute}")
  private String attribute;

  public MyBean(){

  }
...

在您的 application.properties 中有以下条目:

my.config.value = Some value content
my.config.attribute = Some attribute content 

【讨论】:

  • 你知道我通过ApplicationContext自己初始化的方法和Spring-Initialise的方法的区别吗?
  • 自己做的问题,是spring上下文的其余部分不知道你提供的值,因为会先设置上下文,然后你的main方法会调用setter函数在已经设置上下文之后。因此,如果您的上下文中的其他 bean 依赖于您的值,那么它们可能不会看到它们,因为您在 spring 上下文已经构建了所有内容之后设置了这些值。
  • 我可以和你聊天吗?我对此有一些疑问,您似乎对此有所了解。
  • 我想最好在 stackoverflow 上发布更多问题 :-) 很高兴能提供帮助。
  • 关于你的句子“......如果你的其他bean依赖于你的价值观,他们不会看到它们”......我想我知道你的意思,但我不知道吨。我刚刚检查了一下,发现当我使用 Autowired 和 MyBean bean = context.getBean(MyBean.class); 创建一个 bean 时两者都将具有相同的功能-因此看不到任何区别。当我更改使用第二种方法创建的 bean 的值时,获得 Autowired 的 bean 也会更改。每个人都可以看到这些值,即使 bean 是使用第二种方法创建的。或者你是什么意思?
猜你喜欢
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2017-08-28
  • 1970-01-01
  • 2022-01-02
  • 2015-10-25
  • 1970-01-01
相关资源
最近更新 更多