Spring Boot从应用程序属性读取值

时间:2018-08-28 12:19:44

标签: java spring

我不确定我是否理解正确,但是从我得到的结果来看,我可以使用@Value注释从我的application.properties中读取值。

我发现这仅适用于Beans

我这样定义了一个豆

@Service
public class DBConfigBean {


    @Value("${spring.datasource.username}")
    private String userName;

    @Bean
    public String getName() {
        return this.userName;
    }
}

应用程序启动时,我可以检索用户名,但是-如何在运行时访问该值?

每当我这样做

DBConfigBean conf = new DBConfigBean() conf.getName();

*编辑*

由于注释,我可以使用此配置DBConfigBean-但是当我想在另一个类中使用它时,我的最初问题仍然存在

@Configurable
public SomeOtherClass {

   @Autowired
   private DBConfigBean dbConfig; // IS NULL

   public void DoStuff() {
       // read the config value from dbConfig
   }
} 

如何在一些可以定义为bean的帮助程序类中读取DBConfig

谢谢

4 个答案:

答案 0 :(得分:3)

正如Eirini所说,您必须注入咖啡豆。

@Value注释仅适用于Spring bean。

还有另一种使用@ConfigurationProperties访问配置的方法。 在那里定义一个类来保存配置。 主要优点是,它是类型安全的,并且配置在一个地方。

详细了解以下内容: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-vs-value

答案 1 :(得分:1)

您不应使用新的运算符实例化您的服务。您应该注入它,例如

@Autowired
private DBConfigBean dbConfig;

然后是dbConfig.getName();

此外,您的@Bean方法中不需要任何getName()装饰器

您只需要告诉spring在哪里搜索带注释的bean。因此,在您的配置中,您可以添加以下内容:

@ComponentScan(basePackages = {"a.package.containing.the.service",
                             "another.package.containing.the.service"})

编辑

春天意识到,@Value@Autowired等批注只能与bean一起使用。

将您的SomeOtherClass声明为Bean,并将包配置添加到您的@Configuration类中

@Bean
private SomeOtherClass someOtherClass;

然后

 @Configuration
 @ComponentScan(basePackages = {"a.package.containing.the.service"              
  "some.other.class.package"})
 public class AppConfiguration {

  //By the way you can also define beans like:
   @Bean 
   public AwesomeService service() {
       return new AwesomeService();
   }

 }

答案 2 :(得分:1)

用@Component注释包装DBConfig并使用@Autowired注入它:

@Autowired
private DBConfig dbConfig;

答案 3 :(得分:0)

只需在您的DBConfigBean类中添加以下注释:

@PropertySource(value = {“” classpath:application.properties“})