gpt4 book ai didi

java - 在 Spring Boot 中检索 bean?

转载 作者:行者123 更新时间:2023-12-01 19:29:09 25 4
gpt4 key购买 nike

我过去曾使用过旧版 Spring。我们通过 xml 配置定义了 beans 并手动连接它们。我的团队最终齐心协力更新注释并使用 Spring Boot,而不是使用 Spring MVC 的“传统”方法。

话虽如此,我无法弄清楚我到底是如何在 Boot 中检索 bean 的。在遗留系统中,Spring 要么使用构造函数/setter 注入(inject)(取决于我们的配置),要么我们可以直接使用 context.getBean("myBeanID"); 调用 bean,但是,它似乎并不情况不再如此。

我整理了一个小测试用例,尝试在下面的代码中使其正常工作:

package com.ots;


import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class GriefUIApplication{

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

SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(GriefRecord.class).addAnnotatedClass(RecordId.class)
.addAnnotatedClass(CrossReferenceRecord.class)
.buildSessionFactory();

Statics.setSessionFactory(factory);

TennisCoach tCoach = new TennisCoach();
tCoach.getCoach();

}

}



interface Coach{
public String workout();
}


@Service
class TennisCoach implements Coach{

private Coach soccerCoach;
@Autowired
private ApplicationContext context;


public TennisCoach() {

}

public Coach getCoach() {

System.out.println(context + " IS THE VALUE OF THE CONTEXT OBJECT");

soccerCoach = (SoccerCoach)context.getBean("soccerCoach");

System.out.println(soccerCoach.getClass());

return soccerCoach;

}

@Override
public String workout() {
String practice = "practice your backhand!";
System.out.println(practice);
return practice;
}


}

@Service
class SoccerCoach implements Coach{

public SoccerCoach() {

}

@Override
public String workout() {
String practice = "practice your footwork!";
System.out.println(practice);
return practice;
}

}

@RestController
class MyController{

@GetMapping("/")
public String sayHello() {

return "Time on server is: " + new java.util.Date();
}

}

我尝试将 ApplicationContext 对象 Autowiring 到 TennisCoach 类中。当我运行这个时,该对象为空。

我们如何在 Boot 中检索 Bean?

最佳答案

最常见的方法是使用@Autowired注释。另外,由于您有 Coach 接口(interface)的两个不同实现,因此您应该使用 @Qualifier 注释来告诉 Spring 要注入(inject)哪个接口(interface)实现。

一些关于这两个注释的教程,帮助您入门:

对于您的示例,要将 bean 注入(inject) Controller ,您应该执行以下操作:

@RestController
class MyController {

@Autowired
@Qualifier("soccerCoach")
private Coach coach;

@GetMapping("/")
public String sayHello() {
// this should invoke the workout() from SoccerCoach implementation
System.out.println(coach.workout());

return "Time on server is: " + new java.util.Date();
}

}

或者,如您所愿,使用构造函数注入(inject)将 soccerCoach 注入(inject)到 tennisCoach 中,代码将变为:

@Service
class TennisCoach implements Coach {

private Coach soccerCoach;

@Autowired
public TennisCoach(@Qualifier("soccerCoach") Coach soccerCoach) {
this.soccerCoach = soccerCoach;
}

public Coach getCoach() {
System.out.println(soccerCoach.getClass());

return soccerCoach;
}

}

如果您确实需要使用 ApplicationContext 来检索某些 bean,则不建议在具有 main 函数的类中执行此操作。只需创建另一个 bean(您可以使用 @Componenent 注释)。这是一个例子:

@Component
public class AnyComponent {

@Autowired
private ApplicationContext applicationContext;

public void invokeCoach() {
System.out.println(applicationContext.getBean("tennisCoach"));
System.out.println(applicationContext.getBean(SoccerCoach.class));
}

}

并将此 bean 注入(inject)到您的应用程序流中,可以在 Controller 、服务或存储库中:

@RestController
class MyController {

@Autowired
private AnyComponent anyComponent;

@GetMapping("/")
public String sayHello() {
anyComponent.invokeCoach();

return "Time on server is: " + new java.util.Date();
}

}

注意:通过注解注入(inject) bean 是 Spring 特有的,一般来说,而不是 Spring Boot 特有的。

来自https://www.baeldung.com/spring-autowire :

Starting with Spring 2.5, the framework introduced a new style of Dependency Injection driven by @Autowired Annotations. This annotation allows Spring to resolve and inject collaborating beans into your bean.

关于java - 在 Spring Boot 中检索 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60323390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com