我有一个用于与需要初始化的服务交互的特定类。在应用程序生命周期中,唯一有意义的地方是应用程序的启动,因为没有它,spring应用程序的其余部分将无法运行。我有这个想法:
requests.post(<...>,json=data)
这将启动服务并尝试连接,但是我有一个大问题。如何在应用程序中传递此类?我需要在正在编写的服务端点中使用它的功能。
我没有发现任何明显的东西,并且搜索“在Spring Boot应用程序中传递类实例”发现了一系列无关的主题。
在弹簧靴中是否有一种聪明,干净的方法来做到这一点?我为一个人为的例子表示歉意。服务的名称足够独特,我不想违反任何协议。
答案 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();
}
}