--- title: 'Spring boot @Value annotation' disqus: hackmd --- ###### tags: `SpringBoot` Spring boot @Value annotation === [TOC] ## 筆記目的 了解Spring @Value annotation該如何使用,並且將結果打印在console中。 為何要有這個註解是因為有時候你想要注入一些預設值,但是你並不想要寫死在java class中,你想要將他放入xxx.properties的檔案裡,統一管理 參考並改寫自: * [菜鳥工程師](https://matthung0807.blogspot.com/2019/08/spring-boot-properties-file-value.html) * [Spring value DB example](https://www.journaldev.com/21448/spring-value-annotation) * [](https://) 第二個連結有以下程式碼請注意看 ```java= package com.journaldev.spring; import java.sql.SQLException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class SpringMainClass { public static void main(String[] args) throws SQLException { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); context.scan("com.journaldev.spring"); context.refresh(); System.out.println("Refreshing the spring context"); DBConnection dbConnection = context.getBean(DBConnection.class); dbConnection.printDBConfigs(); // close the spring context context.close(); } } ``` ## 先備條件 準備兩個檔案application.properties 和 my-message.properties 將他們兩個都貼入 src/main/resources中 在application.properties放入 `my.food=pizza` 在my-message.properties放入 ``` my.name=mike my.address=asdf my.postcode=97059 my.ticket-price=60 ``` ### 專案架構 ![](https://i.imgur.com/5ADpoB8.png) ## 程式碼部分 pom.xml ```xml= <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.3</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>value</artifactId> <version>0.0.1-SNAPSHOT</version> <name>value</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <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> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ``` Dog.java ```java= package com.example.value; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class Dog { @Value("${my.name}") private String name; @Value("${my.food}") private String weight; public void printinfo() { System.out.println(name); System.out.println(weight); } public Dog( ) { } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getWeight() { return weight; } public void setWeight(String weight) { this.weight = weight; } } ``` ValueApplication.java ```java= package com.example.value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.PropertySource; @SpringBootApplication @PropertySource( value = { "classpath:my-message.properties" }, ignoreResourceNotFound = true, encoding = "UTF-8" ) public class ValueApplication { public static void main(String[] args) { ApplicationContext appCtx = SpringApplication.run(ValueApplication.class, args); Dog mydog = appCtx.getBean(Dog.class); mydog.printinfo(); // AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); // context.scan("com.example.value"); // context.refresh(); // Dog mydogcontext = context.getBean(Dog.class); // // mydogcontext.printinfo(); // context.close(); // have error Error creating bean with name 'dog': Injection of autowired dependencies failed; nested exception is } } ``` ## 打印出來的結果 ![](https://i.imgur.com/2t1V2rp.png) ## 問題點 1. 翻了AIcampaign的程式碼,沒有發現使用 getBean 或是 AnnotationConfigApplicationContext 等字串 Ans 因為使用了autowired 2. ApplicationContext vs AnnotationConfigApplicationContext diff? ## Maybe是解法 [stackoverflow](https://stackoverflow.com/questions/28828748/read-file-properties-using-spring-annotations)