如何在与@SpringBootApplication注释的类不同的类中分离Bean

时间:2019-07-13 13:29:15

标签: java spring spring-boot spring-annotations

我是learinf春季靴子,我开发了belwo简单示例。如图所示,我正在使用两个主要注释@SpringApplication和@RestController。 当我使用邮递员运行Web服务并通过

在后端和前端之间进行通信时
http:://localhost:8080

我可以使用@RequestMapping注释的所有方法

我想咨询一下如何将控制器拆分为另一个类。换句话说,我不希望使用@SpringApplication注释的类包含任何 用@RequestMapping注释的类。

例如,我想分别为GreetingText和Greeting创建两个类。

在下面的尝试部分中,是我的尝试,但出现了以下错误:

    //Could not autowire no beans of string

请让我知道:

1-如何在另一个类中拆分“ Greeting”和“ GreetingText”,以便我将其称为follwo:

http://localhost:8080/
http://localhost:8080/GreetingText?

2-为什么使用自动装配时,我收到以下张贴的错误

    //Could not autowire no beans of string

代码

@SpringBootApplication
@RestController
public class GreetingApplicationModelObject {

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

@RequestMapping("/")
public String GreetingText() {
    return "Frontend Greeting";
}

@RequestMapping("/greetingWithParams")
public Greeting Greeting(@RequestParam(value = "val", defaultValue = "no_val_from_front-end") String val) {
    return new Greeting(getRandomValue(), val);
}

public int getRandomValue() {
    Random r = new Random();
    return r.nextInt(1000);
}

}

尝试

@Autowired
private String str;

//Could not autowire no beans of string
@Autowired
GreetingFromDeuController(String str) {
    this.str = str;
}

@Autowired
public String getGreetingFromDeu() {
    return this.str;
}

}

2 个答案:

答案 0 :(得分:1)

您可以根据需要创建任意数量的RestController类。

@RestController
class GreetingController {

    @RequestMapping("/")
    public String greetingText() {
        return "Greeting";
    }

}

这些类将被Spring自动提取。

答案 1 :(得分:0)

Michael是100%正确的人,但是为了更详细地回答您的问题,bean是从项目中的组件扫描中提取的。

您的@SpringBootApplication应该在项目的根包中,在任何父包中都不应定义任何bean。

要定义将由组件扫描拾取的bean,有许多类级别的注释将使该类的bean。
一些常见的是

@Configuration   // application configurations
@Component       // a general bean that you can use anywhere in your project
@RestController  // one or more exposed API endpoints
@Service         // a service bean for business logic of the application
@Respository     // a data access bean

但是还有更多。

我见过的一件常见的事情是下面的包结构

com.test.spring
    MainApplication.java  <-- @SpringBootApplication
    controller
      GreetingController.java <-- @RestController
    config
      AppConfig.java  <-- @Configuration
    service
      GreetingService.java <-- interface, no component
      impl
          GreetingServiceImpl.java <-- @Service
    dao
       GreetingRepsository <-- @Repository

对于您的应用程序,您似乎并不需要所有这些,这只是一个示例

您还可以使用指定实现或类似方法的方法来创建bean。我在以前的

中使用过类似的方法
@Configuration
public class AppConfig {
    @Bean
    public String activeProfile(@Value("{spring.profiles.active}" profile) {
        return profile;
    }
}

Baeldung始终是很好的资源:https://www.baeldung.com/spring-bean-annotations