繁体   English   中英

如何在 Spring 引导库(无主类)中使用注释?

[英]How to use Annotations in a Spring Boot Library (without Main Class)?

我是 spring 引导的新手,并试图弄清楚它的一些工作原理。 在这里,我得到以下实现的 Null 指针异常。 我不确定我们是否可以在没有主 class 的库项目中使用 @Autowire 注释。 也许这听起来很愚蠢,我相信我们可以从创建的服务项目中为库项目执行@ComponentScan。我的问题是查看下面的实现是否有可能在下面的库项目中使用注释,因为注释正在抛出 NullPointerException下面的代码?

图书馆

下面的代码是一个库,它没有主 Class

@Service
class Data {

   public String getData(){
      return "DATA";
   }
} 

class Access{

   @Autowired
   private Data data;

   public String myData(){
  
      return data.getData();   // Null pointer exception
   }
}

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

服务

下面的代码是访问上述库的服务

Controller

@GetMapping("/") 
String print(){

   // Accesses the Library
   Access access=new Access();
   return access.myData();

}

@SpringBootApplication
@ComponentScan(basePackages = { "com.service", "com.library" }) // Hopes this Scans the library package
public class UserApplication {

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

}

pom.xml

<dependency>
    <groupId>com.library</groupId>
    <artifactId>library</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

如果我从库代码中删除Autowired ,并正常创建 object(使用 new 关键字),一切正常。 所以我的问题是,为了使用注释,需要带有 @SpringBootApplication 的 Main class ,没有 Main class 我们不能运行它吗?

如果您不依赖任何 Spring AOP 功能(例如@Transactional ),那么最好的做法是根本不要这样做 @Autowired字段很脆弱; 相反,使用普通的构造函数。 如果您只有一个构造函数,Spring 不需要注释来实例化 bean,这使您的 class 可用于不同的 DI 环境或普通 Java(例如用于测试)。

同样,不要将@Service放在库中的 class 上; 需要它的客户可以简单地使用@Import将其拉入。

一个例外是,如果您提供Boot auto-configuration setup ,该模块将需要依赖spring-boot-autoconfigure来访问注释。 请注意,习惯上将您的启动器放在一个单独的依赖项中,该依赖项仅包含引导类和元文件。

您需要做的就是使用@Service 或@Component 注释您的库访问 class 并在您的 Controller class 中创建一个字段用于访问 class 和 autowire。 然后在你的方法中使用它


@Service
class Access{

@Autowired
private Data data;

public String myData(){

   return data.getData();
}
}

@RestController
class YourController {
@Autowired
Access access

@GetMapping("/") 
String print(){
return access.myData();

}

使用 SpringBootApplication 注解,它将在启动应用程序时使用所有必需的 bean 创建应用程序上下文。 object 将在需要时注入。

但是在 Normal java 应用程序中,调用新关键字时会创建 Object。

@SpringBootApplication 当你有 @Autowired 注解时需要它,否则你会得到错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM