我是春天的新手。我遇到了Spring-Boot的问题。我正在尝试将外部配置文件中的字段自动装入自动装配的bean中。我有以下课程
App.java
public class App {
@Autowired
private Service service;
public static void main(String[] args) {
final SpringApplication app = new SpringApplication(App.class);
//app.setShowBanner(false);
app.run();
}
@PostConstruct
public void foo() {
System.out.println("Instantiated service name = " + service.serviceName);
}
}
AppConfig.java
@Configuration
@ConfigurationProperties
public class AppConfig {
@Bean
public Service service() {
return new Service1();
}
}
服务接口
public interface Service {
public String serviceName ="";
public void getHistory(int days , Location location );
public void getForecast(int days , Location location );
}
服务1
@Configurable
@ConfigurationProperties
public class Service1 implements Service {
@Autowired
@Value("${serviceName}")
public String serviceName;
//Available in external configuration file.
//This autowiring is not reflected in the main method of the application.
public void getHistory(int days , Location location)
{
//history code
}
public void getForecast(int days , Location location )
{
//forecast code
}
}
我无法在App类的postconstruct方法中显示服务名称变量。我这样做了吗?
答案 0 :(得分:3)
您可以通过不同方式加载属性:
想象一下以下由spring-boot自动加载的application.properties。
spring.app.serviceName=Boot demo
spring.app.version=1.0.0
使用@Value
注入值@Service
public class ServiceImpl implements Service {
@Value("${spring.app.serviceName}")
public String serviceName;
}
使用@ConfigurationProperties
注入值@ConfigurationProperties(prefix="spring.app")
public class ApplicationProperties {
private String serviceName;
private String version;
//setters and getters
}
您可以使用@Autowired
@Service
public class ServiceImpl implements Service {
@Autowired
public ApplicationProperties applicationProperties;
}
您可以注意到前缀为spring.app
,然后spring-boot将匹配属性前缀,并查找serviceName
和version
,并注入值。
答案 1 :(得分:2)
考虑到您在顶部包中注明了App
和@SpringBootApplication
类,您可以将App
放在serviceName
内并使用application.properties
。如果您已经在配置上使用@Value("${serviceName}")
它将会发生冲突,请不要在课程上使用@Component
,因此@Bean
与@Autowired
有关详细信息,请参阅docs
你会以
之类的结尾@Value
当你有@ Component / @ Service / @ Repository
时,不需要@Bean声明@Service // @Component specialization
public class Service1 implements Service {
@Value("${serviceName}")
public String serviceName;
//Available in external configuration file.
//This autowiring is not reflected in the main method of the application.
public void getHistory(int days , Location location)
{
//history code
}
public void getForecast(int days , Location location )
{
//forecast code
}
}
你的主要班级
@Configuration
public class AppConfig { //other stuff here not duplicated beans }