我是Spring的新手,我目前正在使用Spring IOC的项目。 这是我的应用程序的当前设置,我试图表示为独立 下面的类在服务器启动期间作为进程启动
Client.java
public final class Client {
public static void main(String[] args) {
try {
ApplicationContext ctx = new ClassPathXmlApplicationContext("context.xml");
String[] beans = ctx.getBeanDefinitionNames();
for (String string : beans) {
System.out.println(beans);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
}
context.xml
<!-- <context:component-scan base-package="com.tradeking" /> -->
<context:annotation-config />
<bean id="stream-core" class="com.StreamHandler" scope="singleton" init-method="init">
<constructor-arg>
<ref bean="streamingthread"/>
</constructor-arg>
</bean>
<bean id="streamingthread" class="com.StreamingThread" scope="singleton" >
</bean>
</beans>
StreamHandler.java
package com;
public class StreamHandler {
private StreamingThread streamThread;
public StreamHandler(StreamingThread streamThread) {
this.streamThread = streamThread;
}
public void init() {
this.streamThread.start();
}
}
StreamingThread.java
package com;
import java.util.HashSet;
import java.util.Set;
public class StreamingThread extends Thread {
private Set<String> streamSet = new HashSet();
public void run() {
while (true) {
for (int i = 0; i < 12; i++) {
streamSet.add("Test" + 1);
System.out.println("Run Called");
}
}
}
}
现在我的问题是,我有另一个名为UbscHandler的类,我需要访问StreamingThread类中存在的streamSet
所以我试过这种方式
在context.xml文件中添加了一个bean id,如图所示
<context:annotation-config />
<bean id="streamingthreadnew" class="com.StreamingThread" scope="singleton" >
@Autowired
@Qualifier("streamingthreadnew")
private StreamingThread sThread;
我在这里面临两个问题
2.我可以使用Spring样式访问该特定类,而不是再创建一个bean id。
已编辑的部分
现在我正在
Hi Streamed Thread Called0
java.lang.NullPointerException
at com.Client.anotherMethod(Client.java:33)
at com.Client.main(Client.java:26)
这是我的context.xml
<bean id="streamingthread" class="com.StreamingThread" scope="singleton" >
</bean>
</beans>
**This is StreamingThread**
package com;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Client{
@Autowired
@Qualifier("streamingthread")
private StreamingThread streamingthread;
public void run()
{
while(true)
{
}
}
public static void main(String[] args) {
try {
ApplicationContext ctx = new ClassPathXmlApplicationContext("context.xml");
String[] beans = ctx.getBeanDefinitionNames();
for (String string : beans) {
}
Client c = new Client();
c.anotherMethod();
} catch (Throwable t) {
t.printStackTrace();
}
}
public void anotherMethod()
{
Set set = streamingthread.getData();
System.out.println(set.size());
}
}
这是我的StreaminThread类
package com;
import java.util.HashSet;
import java.util.Set;
public class StreamingThread extends Thread {
int i=0;
StreamingThread()
{
System.out.println("Hi Streamed Thread Called"+i);
}
private Set<String> streamSet = new HashSet();
public Set getData()
{
return streamSet;
}
public void run() {
/*while (true) {
for (int i = 0; i < 12; i++) {
streamSet.add("Test" + 1);
//s System.out.println("Run Called"+i);
}
}*/
}
}
答案 0 :(得分:1)
如果要注入相同的对象,则不能定义另一个bean,而是使用相同的定义:
<beans>
<bean id="stream-core" class="com.StreamHandler" scope="singleton" init-method="init">
<constructor-arg><ref bean="streamingthread"/></constructor-arg>
</bean>
<bean id="streamingthread" class="com.StreamingThread" scope="singleton" />
</beans>
如果您希望可以访问某个字段,请在您的类中添加一个方法,以便您访问该字段。
编辑:
您只能将(自动装配)Spring bean注入到从应用程序上下文中获取的其他Spring bean中。客户端不是Spring bean,您可以使用new Client()
获取它的实例。 Spring完全不知道这个类及其instanciation,因此它不能将任何对象注入此Client实例。
您必须从应用程序上下文中获取StreamingThread:
StreamingThread streamingThread = applicationContext.getBean(StreamingThread.class);