Java 弹簧自动接线工作不正常

Java 弹簧自动接线工作不正常,java,spring,annotations,Java,Spring,Annotations,我正在编写一个基于JavaSpring的库。我已经为他们编写了junit测试。我的问题是,尽管我的bean正在打印,但它们没有正确地自动连接。它们是空的 这是代码 @Test public void test() { System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames())); try{ DBClient dbClient = new DBClient(); dbC

我正在编写一个基于JavaSpring的库。我已经为他们编写了junit测试。我的问题是,尽管我的bean正在打印,但它们没有正确地自动连接。它们是空的

这是代码

@Test
public void test() {
    System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames()));

    try{
    DBClient dbClient = new DBClient();
    dbClient.doSomething();
    }catch(Exception e){
        e.printStackTrace();
    }
}
以下是我的DBClient代码:

    @Autowired
@Qualifier("UserActivityRepositoryService")
private UserActivityRepositoryService userRepositoryService;

public void doSomething() {
    System.out.println("Inside db client. Getting the count");
    System.out.println(this.userRepositoryService.count());
}
这是我的UserRepositoryService类代码

@Service
@Qualifier("UserActivityRepositoryService")
public class UserActivityRepositoryService implements IRepoClient<UserActivity>{

private UserActivityRepository repo;

@Autowired
public void setUserActivityRepository(UserActivityRepository repo) {
    this.repo = repo;
}

public void create(UserActivity userActivity) {
    repo.save(userActivity);        

}

@Override
public UserActivity save(UserActivity entity) {
    // TODO Auto-generated method stub
    System.out.println("Creating the documenht");
    try{
    repo.save(entity);
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println("userActivity" + entity);
    return null;
}

@Override
public Iterable<UserActivity> save(Iterable<UserActivity> entities) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public UserActivity findOne(String id) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public boolean exists(String id) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public Iterable<UserActivity> findAll() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Iterable<UserActivity> findAll(Iterable<String> ids) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void delete(String id) {
    // TODO Auto-generated method stub

}

@Override
public void delete(UserActivity entity) {
    // TODO Auto-generated method stub

}

@Override
public void delete(Iterable<? extends UserActivity> entities) {
    // TODO Auto-generated method stub

}

@Override
public void deleteAll() {
    // TODO Auto-generated method stub

}

@Override
public long count() {
    // TODO Auto-generated method stub
    return 0;
}
}
@服务
@限定符(“UserActivityRepositoryService”)
公共类UserActivityRepositoryService实现IRepoClient{
私人用户活动报告回购;
@自动连线
公共无效setUserActivityRepository(UserActivityRepository回购){
this.repo=回购;
}
公共void创建(UserActivity UserActivity){
回购保存(用户活动);
}
@凌驾
公共UserActivity保存(UserActivity实体){
//TODO自动生成的方法存根
System.out.println(“创建文档”);
试一试{
回购保存(实体);
}捕获(例外e){
e、 printStackTrace();
}
System.out.println(“用户活动”+实体);
返回null;
}
@凌驾
公共Iterable存储(Iterable实体){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共用户活动findOne(字符串id){
//TODO自动生成的方法存根
返回null;
}
@凌驾
存在公共布尔值(字符串id){
//TODO自动生成的方法存根
返回false;
}
@凌驾
公共可引用findAll(){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共Iterable findAll(Iterable ID){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共无效删除(字符串id){
//TODO自动生成的方法存根
}
@凌驾
公共作废删除(UserActivity实体){
//TODO自动生成的方法存根
}
@凌驾

public void delete(Iterable经典的Spring新手错误。我已经看过一千遍了

您自动连接了一个类
DBClient
,希望Spring能够为您处理所有依赖项注入

然后通过调用
new
,实例化您自己的实例:

DBClient dbClient = new DBClient();
一旦你调用
new
,它就失去了Spring的控制。这里没有自动连接,
UserActivityRepositoryService
为空

您必须做出选择:要么让Spring控制一切,要么就这么做

如果您正在进行测试,我建议您使用mock并将Spring排除在JUnit测试之外

我还建议您更喜欢构造函数注入,而不是getter/setter,这样您就可以在需要时在代码中完成,比如在编写单元测试时


看起来您正在尝试编写数据服务。我建议您忘记框架,使用Spring Boot。它已经为您准备好了。

经典的Spring新手错误。我已经见过一千次了

您自动连接了一个类
DBClient
,希望Spring能够为您处理所有依赖项注入

然后通过调用
new
,实例化您自己的实例:

DBClient dbClient = new DBClient();
一旦你调用
new
,它就失去了Spring的控制。这里没有自动连接,
UserActivityRepositoryService
为空

您必须做出选择:要么让Spring控制一切,要么就这么做

如果您正在进行测试,我建议您使用mock并将Spring排除在JUnit测试之外

我还建议您更喜欢构造函数注入,而不是getter/setter,这样您就可以在需要时在代码中完成,比如在编写单元测试时


看起来您正在尝试编写数据服务。我建议您忘记框架,使用Spring Boot。它已经为您准备好了。

您需要这样更改测试(正如duffymo所说):


您需要这样更改您的测试(正如duffymo已经说过的):



请共享UserActivityRepositoryService代码已使用UserActivityRepositoryService代码更新请共享UserActivityRepositoryService代码已使用UserActivityRepositoryService代码更新已理解。我正在编写一个库,接口只是一个工厂,应该返回一个bean的自动连接实例。我该怎么办那是什么?为什么你要在Spring Bean工厂已经可用的情况下编写工厂?你正在用一个框架包装一个框架?无法想象这为什么会被否决。谁愿意解释为什么?我不想提供RESTFul服务。我真的想公开一个工厂,它返回UserActivityReposit实例我不知道什么是“暴露”意思是。这是你的应用程序使用的内存对象吗?它是web对象吗?Spring Boot比你做得更好。也许你可以通过查看它们的操作方式来了解一些东西。明白。我正在编写一个库,接口只是一个工厂,应该返回一个bean的自动连接实例。我怎么做?你为什么要编写fac当你已经可以使用Spring Bean工厂的时候?你正在用一个框架包装一个框架?无法想象这为什么会被否决。谁愿意解释为什么?我不想提供RESTFul服务。我真的想公开一个工厂,它返回UserActivityRepositoryService的实例。我不知道是什么“暴露"意思是。这是你的应用程序使用的内存对象吗?它是web对象吗?Spring Boot比你做得更好。也许你可以通过观察他们的操作方式来了解一些东西。这只有在Spring被设置为自动连接测试时才有效。这还不够。因为surya能够访问applicationContext,我想测试已经完成了我用'@RunWith(SpringRunner.class)命名“。对于给定的不完整代码片段,不可能看到测试中给出的内容和缺少的内容。我假设最坏的情况是,因为surya不了解自动连线是如何工作的。这只有在Spring设置为自动连线测试时才起作用。这是不够的。由于surya能够访问applicationContext,我假设测试已经完成了配置为“@RunWith(SpringRunne