库中的Bean注入失败

时间:2019-04-29 07:02:58

标签: java spring dependency-injection

我创建了一个库,在其中创建了一些bean。以下是我正在创建一些bean的文件:

@Configuration
public class StorageBindings {

  @Value("${storageAccountName}")
  private String storageAccountName;

  @Value("${storageAccountKey}")
  private String storageAccountKey;


  @Bean(name = "cloudBlobClient")
  public CloudBlobClient getCloudBlobClientUsingCredentials() throws URISyntaxException {
     return new CloudBlobClient();
  }


  @Bean(name = "storageCredentialsToken")

  public StorageCredentialsToken getStorageCredentialsToken() throws IOException {
     return new StorageCredentialsToken();
  }

  @Bean(name = "msiTokenGenerator")
  public MSITokenGenerator getMSITokenGenerator() {
    return new MSITokenGenerator();
  }
}

然后我创建了该类,将其用作入口点以进行进一步的操作

public class StorageClient {

  @Autowired
  private CloudBlobClient cloudBlobClient;

  @Autowired
  private MSITokenGenerator msiTokenGenerator;

  @Value("${storageAccountName}")
  private String storageAccountName;

  @Value("${storageAccountKey}")
  private String storageAccountKey;
}

我用上面的文件创建了jar,并将其包含在我们的主项目中,在其中创建了StorageClient的bean,如下所示:

@Bean(name = {"storageClient"})
    public StorageClient getStorageClient() {
        LOG.debug("I am inside storage class");
        StorageClient ac = null;
        try {
            ac = new StorageClient();
            return ac;
    }

但是执行后,我发现在StorageClient实例ac中没有注入以下变量,甚至没有反映环境属性,并且所有这些都为空:

   //beans NOT Injecting 
   ac.cloudBlobClient=null;
   ac.msiTokenGenerator=null;

//env variables
   ac.storageAccountName=null;
   ac.storageAccountKey=null;

我错过了什么吗,因为我越来越空了。实例化bean的顺序还可以。我检查了。因此,首先创建了StorageBindings的bean。

2 个答案:

答案 0 :(得分:3)

执行此操作时:

ID,Name,Gender
101,X,M
102,Y,F

您丢失了spring的上下文,因为您是根据该上下文创建一个新实例。 ac = new StorageClient(); CloudBlobClient和变量MSITokenGeneratorstorageAccountName中的bean不会被注入。

您可以用storageAccountKey注释StorageClient

因此,由于将其打包为jar,因此在主项目中必须确保@Component包含@ComponentScan所在的路径。

那么您可以做:

StorageClient

在您的主项目中。

答案 1 :(得分:2)

如果要在带有注释的方法class Class_teacher(models.Model): first_name = models.CharField(max_length=200) last_name = models.CharField(max_length=200) standard = models.IntegerField() division = models.CharField(max_length=1) subject = models.CharField(max_length=200) email = models.CharField(max_length=30) class Student(models.Model): first_name = models.CharField(max_length=200) last_name = models.CharField(max_length=200) classteacher = models.ForeignKey('Class_teacher', on_delete=models.SET_NULL,blank=True, null=True ) 中创建对象,则自动装配不会在其中注入bean-您只是在自己创建对象。 因此,您必须@Bean,即在@Autowire类中的字段上,并使用setter / constructor进行设置。 即:

Configuration