Java 何时以及如何在RESTAPI中实例化Springbean

Java 何时以及如何在RESTAPI中实例化Springbean,java,spring,rest,spring-boot,spring-bean,Java,Spring,Rest,Spring Boot,Spring Bean,首先,我是Spring Boot的一个相对noob,所以请记住这一点 我有一个restapi,在其中我试图最小化对同一对象的数据库调用,并且我已经确定使用作用域为请求的springbean是我想要的。假设这是正确的,下面是我要做的: 1控制器接收经验证的PhotoImportCommand和DTO命令 光通信控制器 我想做的是以某种方式设置在@UserExistsConstraint中验证的用户的Springbean,并在Http请求中调用的各种方法中引用它,但我不确定如何做到这一点。因为我从来

首先,我是Spring Boot的一个相对noob,所以请记住这一点

我有一个restapi,在其中我试图最小化对同一对象的数据库调用,并且我已经确定使用作用域为请求的springbean是我想要的。假设这是正确的,下面是我要做的:

1控制器接收经验证的PhotoImportCommand和DTO命令

光通信控制器

我想做的是以某种方式设置在@UserExistsConstraint中验证的用户的Springbean,并在Http请求中调用的各种方法中引用它,但我不确定如何做到这一点。因为我从来没有真正创建过自己的SpringBean,所以我不知道如何继续。我已经阅读了各种各样的指南,比如,但是仍然不知道如何在我的代码中实现它

任何帮助/示例都将不胜感激。

您可以使用@Bean注释

@Configuration
public class MyConfiguration {

@Bean({"validUser"}) 
public User validUser() {
    User user;
    //instantiate user either from DB or anywhere else
    return user;
}
然后你就可以得到validUser了

@Component
public class PhotoImportCommandDto extends BaseCommand {

    @Autowired
    @Qualifier("validUser")
    private User validUser;
...
}

我真的不知道如何用Java做注释。无论如何,在Spring中,检查用户是否存在于数据库中是一行代码:

userRepository.findOne(user) == null
这是由项目完成的:

创建一个JPA实体用户

在中设置spring.datasource.url和登录/密码 resources/application.properties

创建此界面:

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends CrudRepository<User, Long> {
}
请注意,Springbean是任何带注释的@Component类,其中包括原型注释,如Controller、Repository-只需查找注释的内容,它可以在内部使用@Component,也可以从带注释的方法返回@Bean。@Bean只能位于组件或配置类上。通过搜索类路径来注入组件,Bean的注入更加自然

还要注意,注入是在字段或构造函数、工厂方法或setter上指定@Autowired注释。文档建议将必需的依赖项注入构造函数,将非必需的依赖项注入setter

还要注意的是,如果您正在注入到构造函数中,并且它被参数清除了,那么您可以省略@Autowired注释,Spring会解决这个问题

调用它的方法findOne。 因此,您可以执行以下操作之一:

如上所示,将userRepository注入@RestController构造函数。我会那样做的。 将userRepository注入@Service internal@组件类,该类将为您完成这类工作。也许你可以用它来创建一个注释。 p、 使用@PostMapping代替@RequestMappingmethod=RequestMethod.POST

p、 注意:如果您有任何疑问,请转到官方文档页面,只需按CTRL-F键:注意当前单词,它将始终引导您进入最新版本

p、 p.p.s每个Spring项目都有自己的.io网页和快速入门指南,在这里您可以快速查看示例项目,并提供一些解释,希望您什么都不知道

希望有帮助!:


如果你愿意,别忘了将答案标记为已接受。使用Jose的输入,我采取了一些不同的方法

以下是我所做的: 我创建了一个ValidateUser类:

我还创建了一个包装类HttpRequestScopeConfig来捕获所有变量,以便在对api的Http请求过程中使用

@Component
public class HttpRequestScopeConfig {

    @Autowired
    private ValidatedUser validatedUser;
    ...
    public UserEntity getValidatedUser() {
        return validatedUser.getUser();
    }

    public void setValidatedUser(UserEntity validatedUser) {
        this.validatedUser.setUser(validatedUser);
    }
        ...
}
在我的UserExistsConstraintValidator中,它是@UserExistsConstraint的impl,我在httpRequestScopeConfig中设置了ValidateUser:

public class UserExistsConstraintValidator implements ConstraintValidator<UserExistsConstraint, Long> {

    //private Log log = LogFactory.getLog(EmailExistsConstraintValidator.class);

     @Autowired
     private UserCommandService svc;

     @Autowired
     private HttpRequestScopeConfig httpRequestScope;

     @Override
     public void initialize(UserExistsConstraint userId) {

     }

     @Override
     public boolean isValid(Long userIdField, ConstraintValidatorContext context) {

      try {
       UserEntity user = svc.findUserOfAnyStatus((Long) userIdField);
       if (user != null) {
           httpRequestScope.setValidatedUser(user);
           return true;
       }
      } catch (Exception e) {
       //log.error(e);
      }
      return false;
     }

}

现在,我可以在需要时通过自动连接HttpRequestScopeConfig在我的其余服务层中访问这些变量。

您应该使用spring数据jpa
    private UserRepository userRepository ;

**constructor**(UserRepository ur){
    userRepository = ur;
}
@RequestScope
@Component
public class ValidatedUser {

    private UserEntity user;

    public UserEntity getUser() {
        return user;
    }

    public void setUser(UserEntity user) {
        this.user = user;
    }

}
@Component
public class HttpRequestScopeConfig {

    @Autowired
    private ValidatedUser validatedUser;
    ...
    public UserEntity getValidatedUser() {
        return validatedUser.getUser();
    }

    public void setValidatedUser(UserEntity validatedUser) {
        this.validatedUser.setUser(validatedUser);
    }
        ...
}
public class UserExistsConstraintValidator implements ConstraintValidator<UserExistsConstraint, Long> {

    //private Log log = LogFactory.getLog(EmailExistsConstraintValidator.class);

     @Autowired
     private UserCommandService svc;

     @Autowired
     private HttpRequestScopeConfig httpRequestScope;

     @Override
     public void initialize(UserExistsConstraint userId) {

     }

     @Override
     public boolean isValid(Long userIdField, ConstraintValidatorContext context) {

      try {
       UserEntity user = svc.findUserOfAnyStatus((Long) userIdField);
       if (user != null) {
           httpRequestScope.setValidatedUser(user);
           return true;
       }
      } catch (Exception e) {
       //log.error(e);
      }
      return false;
     }

}