我应该永远不要在 Spring Boot 项目中使用“new”关键字吗?

Ayo*_*b k 1 java spring dependency-injection spring-boot

我正在研究 Spring Boot Rest API,但最终还是在new这里和那里使用了关键字。

我想知道,当我为我的程序使用 new 关键字时,我做错了什么。如果在实际项目中绝对禁止使用 new 关键字。

如果答案是肯定的,我应该用@component注释来注释我写的每个类,以便我可以使用@autowired.

如果答案是否定的,我们什么时候可以打破这条规则?

Ami*_*kar 6

没有使用或不使用的规则new。如果您想要 Spring 管理您的对象还是想要自己处理它们,这取决于您。Spring 简化了对象创建、依赖管理和自动装配;但是,new如果您不想要的话,可以使用实例化它。


Sai*_*kat 6

您可以在 spring 应用程序中使用 new 关键字创建对象。

但是这些对象将超出 Spring Application Context 的范围,因此不是 spring 管理的。

由于这些不是 spring 管理的,任何嵌套的依赖级别(例如您的 Service 类引用了您的 Repository 类等)都不会被解析。

因此,如果您尝试调用服务类中的方法,则最终可能会获得存储库的 NullPointer。

@Service
public class GreetingService {
    @Autowired
    private GreetingRepository greetingRepository;
    public String greet(String userid) {
       return greetingRepository.greet(userid); 
    }
}

@RestController
public class GreetingController {
    @Autowired
    private GreetingService greetingService;
    @RequestMapping("/greeting")
    public String greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
        return String.format("Hello %s", greetingService.greet(name));
    }
    @RequestMapping("/greeting2")
    public String greeting2(@RequestParam(value = "name", defaultValue = "World") String name) {
      GreetingService newGreetingService = new GreetingService();
      return String.format("Hello %s", newGreetingService.greet(name));
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中/greeting会工作但/greeting2会失败,因为嵌套的依赖关系没有解析。

所以如果你想让你的对象被弹簧管理,那么你必须自动装配它们。一般来说,对于视图层 pojo 和自定义 bean 配置,您将使用new关键字。