[SPRING] Spring 주석을 사용하여 파일 속성 읽기
SPRINGSpring 주석을 사용하여 파일 속성 읽기
봄을 사용하여 속성 파일을 읽는 방법을 배우려고합니다. 인터넷 검색을 한 후에는 @value 및 @PropertySource 주석을 사용하여이를 달성 할 수 있음을 발견했습니다. 나는 다음과 같은 구조와 클래스 코드를 가진 프로젝트를 만들었다 :
프로젝트의 구조 :
AppConfigMongoDB.java 구현 :
package com.mongodb.properties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
@PropertySource("classpath:config/config.properties")
public class AppConfigMongoDB {
@Value("#{mongodb.url}")
private String mongodbUrl;
@Value("#{mongodb.db}")
private String defaultDb;
public String getMongoDb()
{
return defaultDb;
}
public String getMongoDbUrl()
{
return mongodbUrl;
}
}
SpringConfiguration.java 구현 :
package com.mongodb.properties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfiguration {
@Bean
public AppConfigMongoDB getAppConfigMongoDB(){
return new AppConfigMongoDB();
}
}
Main.java
package com.mongodb.properties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);
AppConfigMongoDB mongo = applicationContext.getBean(AppConfigMongoDB.class);
System.out.println("db= "+mongo.getMongoDb());
System.out.println("URL= "+mongo.getMongoDbUrl());
}
}
내가 읽었던 속성 파일은 config.properties라는 이름으로 다음 행을 포함합니다.
mongodb.url=1.2.3.4
mongodb.db=dataBase
이 작은 프로젝트를 테스트하고 다음 예외가 포함 된 스택 추적 있어요 :
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getAppConfigMongoDB': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.mongodb.properties.AppConfigMongoDB.mongodbUrl; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Property or field 'mongodb' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public?
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84)
at com.mongodb.properties.Main.main(Main.java:9)
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Property or field 'mongodb' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public?
at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:226)
at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:93)
at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:81)
at org.springframework.expression.spel.ast.CompoundExpression.getValueRef(CompoundExpression.java:51)
at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:87)
at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:120)
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:242)
at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:161)
... 18 more
봄 부르는 콩의 문제인가? 아니면 속성 파일 경로 또는 다른 문제일까요?
해결법
-
==============================
1.코드에서 몇 가지 문제점을 볼 수 있습니다.
코드에서 몇 가지 문제점을 볼 수 있습니다.
1) 값을 저장하는 장소는 # {mongodb.url}이 아닌 $ {mongodb.url} 형식이어야합니다. "#"은 다른 의미를 갖습니다 (스프링 표현식 참조).
2) 값 주입을 수행하려면 PropertySourcesPlaceholderConfigurer bean이 필요합니다.
3) 조만간 콩이 떠 다니게 될 것입니다. @ComponentScan을 사용하면 컨텍스트가 이들을 하나씩 언급하지 않고도 알 수 있습니다.
4) ComponentScan을 사용하여 빈을 가져 오는 경우 AppConfigMongoDB 빈을 한 번 제공해야합니다.
나는이 모든 것을 한 후에 이러한 수업을 마친다.
Main.java
import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class); AppConfigMongoDB mongo = applicationContext.getBean(AppConfigMongoDB.class); System.out.println("db= "+mongo.getMongoDb()); System.out.println("URL= "+mongo.getMongoDbUrl()); } }
SpringConfiguration.java
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; @Configuration @ComponentScan public class SpringConfiguration { @Bean public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() { return new PropertySourcesPlaceholderConfigurer(); } }
AppConfigMongoDB.java
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource("classpath:config/config.properties") public class AppConfigMongoDB { @Value("${mongodb.url}") private String mongodbUrl; @Value("${mongodb.db}") private String defaultDb; public String getMongoDb() { return defaultDb; } public String getMongoDbUrl() { return mongodbUrl; } }
-
==============================
2.@Ian Sparkes의 멋진 회신. 내 입력 사항 중 일부를 여기에 추가합니다. PropertySourcesPlaceholderConfigurer 구성은 필수 항목이 아닙니다. 내 속성 파일에서 값을 가져올 수 있고 그것을 사용하지 않고 내 기본 Configuration 클래스의 파일 변수로 설정할 수 있습니다.
@Ian Sparkes의 멋진 회신. 내 입력 사항 중 일부를 여기에 추가합니다. PropertySourcesPlaceholderConfigurer 구성은 필수 항목이 아닙니다. 내 속성 파일에서 값을 가져올 수 있고 그것을 사용하지 않고 내 기본 Configuration 클래스의 파일 변수로 설정할 수 있습니다.
속성 파일에서 키 값을 가져 오는 또 다른 방법이 있습니다. org.springframework.core.env.Environment 클래스를 사용하십시오. 이 클래스는 클래스 경로에있는 속성 파일에 모든 키 - 값 쌍을 자동으로로드합니다.
예 :
@Configuration @ComponentScan (basePackages = "com.easy.buy") @PropertySource ({ "classpath : config.properties", "classpath : props / db - $ {env} -config.properties", "classpath : props / app - $ {env} -config.properties"}) 공용 클래스 CatalogServiceConfiguration { 로거 로거 = LoggerFactory.getLogger (CatalogServiceConfiguration.class); //이 객체는 키 쌍 값으로 모든 속성을로드하고 보유합니다. @Autowired 개인 환경 env; / ** * DataSource bean 인스턴스화 및 db 연결 속성으로 초기화 * @return * / @Bean (name = "basicDataSource") 공용 BasicDataSource basicDataSource () { 문자열 dbUrl = env.getProperty ( "db.url"); 문자열 dbUser = env.getProperty ( "db.user"); 문자열 dbPwd = env.getProperty ( "db.pwd"); 문자열 드라이버 = env.getProperty ( "db.driver"); logger.info ( "CatalogServiceConfiguration 초기화"); logger.info ( "dbUrl ="+ dbUrl); BasicDataSource ds = 새 BasicDataSource (); ds.setDriverClassName (드라이버); ds.setUrl (dbUrl); ds.setUsername (dbUser); ds.setPassword (dbPwd); return ds; } }
from https://stackoverflow.com/questions/28828748/read-file-properties-using-spring-annotations by cc-by-sa and MIT license