SpringApplication.run(),无需 Boot

pdkcd3nj  于 2023-09-29  发布在  Spring
关注(0)|答案(1)|浏览(92)

我是一个初学者与Spring。我目前正在尝试运行一个非常简单的项目,只是为了开始学习Spring并理解IoC和依赖注入。起初我创建了一个简单的Sping Boot 项目,它工作正常,但现在我试图在没有引导的情况下完成它,因为我想更好地了解发生了什么。我不知道该怎么做(下面的完整类):
SpringApplication.run(TestSpringApplication.class, args);
我试着这样做:

TestSpringApplication app = new TestSpringApplication();
app.run(args);

但是在run()方法中,@Autowired messageRepository为null。我猜这是因为我使用new而不是applicationContext.getBean()创建了TestSpringApplication?但是如何在静态main方法中访问/获取applicationContext呢?
原谅我,如果它可能听起来微不足道,我几乎从零开始在这里,我有一个很难找到容易的教程。
以下是我正在尝试做的,但没有工作:

package com.cypherf;
import com.cypherf.model.Message;
import com.cypherf.repository.MessageRepository;
import com.cypherf.service.MessageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class TestSpringApplication {
    @Autowired
    private ApplicationContext context;

    @Autowired
    private MessageRepository messageRepository;

    @Autowired
    private MessageService messageService;

    public static void main(String[] args) {
        TestSpringApplication app = new TestSpringApplication();
        app.run(args);
    }

    public void run(String... args) {
        messageRepository.save(new Message("Message one"));
        messageRepository.save(new Message("Message two"));
        messageRepository.save(new Message("Message two"));

        messageService.printAllMessages();
    }
}

这是我以前的Sping Boot 类,它正在工作:

package com.cypherf;
import com.cypherf.model.Message;
import com.cypherf.repository.MessageRepository;
import com.cypherf.service.MessageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TestSpringApplication implements CommandLineRunner {

    @Autowired
    private MessageRepository messageRepository;

    @Autowired
    private MessageService messageService;

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

    public void run(String... args) throws Exception {
        messageRepository.save(new Message("Message one"));
        messageRepository.save(new Message("Message two"));
        messageRepository.save(new Message("Message two"));

        messageService.printAllMessages();
    }
}
a6b3iqyw

a6b3iqyw1#

如果你没有使用Sping Boot ,那么你必须通过创建一个ApplicationContext bean来自己设置Spring容器。
一种方法是使用AnnotationConfigApplicationContext类。举例来说:

public static void main(String[] args) {
    ApplicationContext context = new ApplicationConfigApplicationContext(TestSpringApplication.class);
    MessageService messageService = context.getBean(MessageService.class);
    messageService.printAllMessages();
}

但这只是为您创建了一个基本的应用程序上下文。如果没有Sping Boot ,您将无法再访问自动配置。这意味着:

  • 如果您依赖于数据库,那么现在必须手动创建DataSourcebean。
  • 如果您依赖于Spring Data JPA的存储库,则现在必须手动创建EntityManagerFactory bean和TransactionManager(并且还必须配置Spring Data JPA)。
  • 如果您正在运行Web应用程序,则不再可以访问Sping Boot 的嵌入式servlet容器。现在,您要么自己配置嵌入式Tomcat,要么为传统的WAR文件部署配置应用程序。
  • 如果printAllMessages()依赖于一个日志框架,那么您现在还必须自己配置这个框架。

此外,像CommandLineRunner这样的类也不再可用。现在你不得不依靠其他选择,比如听ContextRefreshedEvent

相关问题