Skip to main content
 首页 » 编程设计

spring中在spring框架中使用非注释类(bean)可以吗

2025年12月25日22Free-Thinker

我有一个 spring-boot 项目。我以“spring”方式使用一些类,这意味着它们由“@Service”、“@Repository”、“@Autowired”注释。同时,我有很多类,这些类仅以正常的Java方式使用,这意味着没有任何Spring注释,并且它们是以在构造函数中构造对象的标准方式创建的。

例如,非注释类之一是:

public class GenericTree<T> 
{ 
    private GenericTreeNode<T> root; 
 
    public GenericTree () 
    { 
        root = null; 
    } 
 
    public GenericTreeNode<T> getRoot () 
    { 
        return this.root; 
    } 
 
    public void setRoot (GenericTreeNode<T> root) 
    { 
        this.root = root; 
    } 
   ... 
} 

混合使用带或不带 Spring 注释的类是否可以或正常?也许,我可以使用 Spring 的注释标记将所有非注释类转换为注释类。这真的有好处还是有必要?

顺便说一句,我的应用程序的主要逻辑和功能不是以 Web 为中心的,尽管它们是作为 Spring 项目创建的。我在Spring中创建的原因是我想为我的界面提供一个Restful服务,以便我可以在开发中轻松地在浏览器中进行测试,而其他人可以使用Restful服务。

请您参考如下方法:

是的,没问题。

请记住,注释并不是 Spring 独有的。注解是在 Java 5 中引入的,它们只是 Java 代码的元数据。此元数据可用于:

  • 编译时间
  • 构建时间
  • 运行时

您甚至可以创建自己的自定义注释并用它们注释您的代码。

Spring 框架附带了一些注解,每个注解都有其用途,但这并不意味着您在使用该框架时必须使用 Spring 注解来注解所有类。

当您将类注释为 Spring Bean 时,它们将成为 Spring 应用程序上下文的一部分,从而使它们可以使用 @Autowired 注释进行注入(inject)(Spring 框架基于依赖注入(inject)设计模式)。但是 Spring 注解也有其他含义,我无法详细介绍其中每一个,但例如,您必须考虑 @Bean、@Component、@Controller、@Repository、@Service 等注解的默认范围是 Singleton 。因此,每当您使用这些注释之一注释一个类并且没有定义范围时,您得到的就是在整个应用程序中共享的单例类。其他范围是:

  • 单例
  • 原型(prototype)
  • 请求
  • session
  • 申请
  • 网络套接字

考虑到您的 GenericTree 类,将抽象数据结构类注释为 Spring Bean 是否有意义?可能不是。

所以,是的,当您开发基于 Spring 框架的应用程序时,通常会混合使用 Spring 带注释的类和常规 POJO。

我建议您阅读 Spring 框架文档,了解什么是依赖注入(inject)以及最常用的 Spring 注解的目的和含义。