在Spring Boot应用程序中共享类的实例

时间:2019-05-14 00:36:04

标签: java spring spring-boot

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

requests.post(<...>,json=data)

这将启动服务并尝试连接,但是我有一个大问题。如何在应用程序中传递此类?我需要在正在编写的服务端点中使用它的功能。

我没有发现任何明显的东西,并且搜索“在Spring Boot应用程序中传递类实例”发现了一系列无关的主题。

在弹簧靴中是否有一种聪明,干净的方法来做到这一点?我为一个人为的例子表示歉意。服务的名称足够独特,我不想违反任何协议。

3 个答案:

答案 0 :(得分:2)

您可以让Spring为您执行此操作。首先,您需要使用@Service注释您的班级,以便Spring在扫描班级时将其选中。

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

@Service
public class MyRequiredService {

    @PostConstruct
    public void init() {
        connect();
    }

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

可以从构造函数中调用connect(),但我不希望定义可能将异常抛出构造函数的对象。

然后,您可以通过MyRequiredService注释将其插入@Autowired,以用于其他类:

@Component
public class MyOtherClass {
    private final MyRequiredService service;

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

    // Other methods here.
}

这与您在上方所做的操作具有相同的总体效果。如果MyRequiredService失败,则该应用程序将无法启动。

答案 1 :(得分:0)

将其制成豆。然后它将在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);
    }
}

恕我直言,而不是捕获错误并记录下来。我会抛出该异常并停止启动应用程序,但为了跟您的示例保持一致,我在日志后添加了throw IllegalStateException。

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

答案 2 :(得分:0)

一个类实现了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();
}

}