Web アプリケーションでは、実際に行う必要はありません ..
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-context.xml");
ctx.getBean("beanId");
一般的な方法は、コンテキスト ファイルをロードし、このように web.xml で ContextLoaderServlet を使用して依存関係を持つすべての Bean を注入することです。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-context.xml /WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- or use the ContextLoaderServlet instead of the above listener
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
-->
ただし、コンテナーのないスタンドアロンの Java アプリでは、ctx.getBean("xyz");を実行することになります。. これを行うためのクリーンな方法はありますか?オンラインで例を見つけることができませんでした。
私はチェックしました..シンプルなSpring、スタンドアロンアプリ用のClasspathApplicationContextの使用、再利用方法は? 、 SingletonBeanFactoryLocatorの使用について説明していますが、最終的には context.getBean() を使用します。
ServiceLocatorFactoryBeanも調べましたが、プロキシを使用してオンデマンドで Bean を取得しています。
オンデマンドで Bean を取得したくないので、スタンドアロンの Java アプリの main() プログラムからコンテキスト ファイル (すべての Bean) をロードするソリューションを探しています。
コード例:
public interface IReader {
public String read();
}
public class TextFileReader implements IReader {
private StringBuilder builder = null;
private Scanner scanner = null;
public TextFileReader(String fileName) throws FileNotFoundException {
scanner = new Scanner(new File(fileName));
builder = new StringBuilder();
}
public String read() {
while (scanner.hasNext()) {
builder.append(scanner.next());
builder.append(",");
}
return builder.toString();
}
}
public class SpringNoConextDataReaderClient {
private IReader reader = null;
public void setReader(TextFileReader reader) {
this.reader = reader;
}
private String fetchDataOne() {
return reader.read();
}
private String fetchDataTwo() {
return reader.read();
}
public static void main(String[] args) {
final ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
String fetchedData = context.getBean(SpringNoConextDataReaderClient.class).fetchDataOne(); // <-- reader is injected as TextFileReader in fetchDataOne which reads the file
SpringNoConextDataReaderClient client = new SpringNoConextDataReaderClient();
client.fetchDataOne(); // <-- reader is null and throws NPE, probably its lifetime ended with previous call?
System.out.println("Example 1.1: Got data without context: " + fetchDataOne);
}
}
spring-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean id="reader" class="com.himalay.spring.core.basic.readers.TextFileReader">
<constructor-arg value="src/main/resources/data.txt" />
</bean>
<bean id="springNoConextDataReaderClient" class="com.himalay.spring.core.basic.SpringNoConextDataReaderClient">
<property name="reader"><ref bean = "reader" /></property>
</bean>
</beans>
ありがとうございました。