[英]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.