Java 跨spring引导应用程序共享类的实例

Java 跨spring引导应用程序共享类的实例,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个特定的类用于与需要初始化的服务进行接口。在应用程序生命周期中,唯一有意义的地方是应用程序的开始,因为没有它,spring应用程序的其余部分无法运行。我有这个想法: @SpringBootApplication public class MyApplication { public static void main(String[] args) { try { MyRequiredService mrs = new MyRequiredSer

我有一个特定的类用于与需要初始化的服务进行接口。在应用程序生命周期中,唯一有意义的地方是应用程序的开始,因为没有它,spring应用程序的其余部分无法运行。我有这个想法:

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        try {
            MyRequiredService mrs = new MyRequiredService();
            mrs.connect(); // This will throw if it fails
            run(MyApplication.class, args);
        } catch(MyException e) {
            System.out.println("Failed to connect to MyRequiredService!");
        }
    }
}
这将启动服务并尝试连接,但我有一个大问题。我如何在申请中通过这门课程?我需要在我正在编写的服务端点中使用它的函数

我没有看到任何明显的东西,搜索“在spring boot应用程序中传递类实例”会发现一些不相关的主题


在spring boot中有没有一种聪明、干净的方法可以做到这一点?我为一个做作的例子道歉。该服务的名称非常独特,我不想违反任何协议。

您可以让Spring为您这样做。首先,您需要使用
@Service
为类添加注释,这样Spring在扫描类时会选择它

然后,定义一个
init()
方法,并用
@PostConstruct
注释它。Spring将实例化您的
MyRequiredService
类并调用
init()

您可以从构造函数调用
connect()
,但我不喜欢定义可能会将异常抛出构造函数的对象

然后,您可以通过
@Autowired
注释将
MyRequiredService
注入到其他类中:

@Component
public class MyOtherClass {
    private final MyRequiredService service;

    public MyOtherClass(final MyRequiredService service) {
        this.service = service;
    }

    // Other methods here.
}

这与您在上面尝试的操作具有相同的总体效果。如果
MyRequiredService
失败,应用程序将无法启动

把它做成豆子。然后它将出现在
ApplicationContext
中,然后您可以通过构造函数将其传递给所需的其他类

@Configuration
public class ApplicationConfiguration
{

    @Bean
    public MyRequiredService myRequiredService()
    {
        MyRequiredService mrs = new MyRequiredService();
        try {
            mrs.connect(); // This will throw if it fails
            return mrs;
        } catch(MyException e) {
            log.error("Failed to connect to MyRequiredService!");
            throw new IllegalStateException("MyRequiredService failed connection. Stopping startup");
        }
    }

    @Bean 
    public SomeOtherService someOtherService(MyRequiredService mrs) {
        return new SomeOtherService(mrs);
    }
}
IMHO,而不是捕获错误并记录它。我会抛出它并停止应用程序启动,但为了与您的示例保持一致,我在日志之后添加了throw IllegalStateException


通过这种方式,Spring将在
ApplicationContext
中创建
MyRequiredService
bean,然后您可以看到我作为bean所需的参数添加到该bean下面。Spring将从
ApplicationContext
中获取该bean,并将其提供给bean。如果Spring没有在
ApplicationContext
中找到bean,它将抛出一个错误并停止应用程序的启动。

一个类实现BeanFactoryPostProcessor,它在普通bean之前初始化

@Configuration
public class MyRequiredService implements BeanFactoryPostProcessor, 
PriorityOrdered, InitializingBean {

@Override
public int getOrder() {
    return Integer.MIN_VALUE;
}

public void connect() {
    // ...
}


@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

}


@Override
public void afterPropertiesSet() throws Exception {
        connect();
}

}

你应该
@Autowire
itAh!!!当然,我已经完全自动布线了。所以我可以像其他类一样自动连接
MyApplication
的内部?是的,阅读一些文档自动连接
@Configuration
public class MyRequiredService implements BeanFactoryPostProcessor, 
PriorityOrdered, InitializingBean {

@Override
public int getOrder() {
    return Integer.MIN_VALUE;
}

public void connect() {
    // ...
}


@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

}


@Override
public void afterPropertiesSet() throws Exception {
        connect();
}