我是 Spring 的新手,我不喜欢使用 .xml 作为 spring 配置。所以我只想使用注释。以下是我的测试代码,它在没有 spring 的情况下运行良好,但是如果我使用 DI 并添加注释“@Resource”,我会得到 NullPointException,任何人都可以帮助解决它,非常感谢。
我已经导入了相关的spring jar。这是一个生产者-消费者案例,我想将资源池注入(inject)生产者和消费者。
生产者.java
import javax.annotation.Resource;
public class Producer implements Runnable{
@Resource
private ResourcePool qs;
@Override
public void run() {
while (true) {
for(int i = 0;i < Integer.MAX_VALUE; i++) {
try {
qs.produce(i);
System.out.println("Add index = " + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
消费者.java
import javax.annotation.Resource;
public class Consumer implements Runnable {
@Resource
private ResourcePool qs;
@Override
public void run() {
while(true) {
for (int i = 0; i < 5; i++) {
try {
System.out.println("Remove index = " + qs.comsume());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
资源池.java
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class ResourcePool {
private BlockingQueue<Integer> aBlockingQueue = new ArrayBlockingQueue<Integer>(11);
public void produce(Integer ins) throws InterruptedException{
aBlockingQueue.put(ins);
}
public int comsume() throws InterruptedException{
return aBlockingQueue.take();
}
}
主要功能
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestPC {
public static void main(String[] args){
ExecutorService aExecutor = Executors.newFixedThreadPool(2);
Producer productor = new Producer();
Consumer consumer = new Consumer();
aExecutor.execute(productor);
aExecutor.execute(consumer);
}
}
异常信息:
Exception in thread "pool-1-thread-2" java.lang.NullPointerException at testbq.Consumer.run(Consumer.java:14) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Exception in thread "pool-1-thread-1" java.lang.NullPointerException at testbq.Producer.run(Producer.java:14) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
谢谢
最佳答案
关于搜索“无 XML Spring 配置”或 Java-based Spring configuration您可能应该在几分钟内自己弄明白。
您还没有定义任何由使用 @Configuration
注释的类托管的 bean 创建方法 - 因此 Spring 能够知道您实际想要注入(inject)什么。
@Configuration
// optional @ComponentScan(basePackages = {"name.your.package.here"}
public class AppConfig
{
@Bean // or @Bean(name = "nameOfYourBean")
public ResourcePool getResourcePool()
{
return new ResourcePool();
}
}
然后在您的主要方法中,您应该创建一个 Spring 上下文并将您的 AppConfig 加载到您的上下文中:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfic.class);
HTH
关于java - 如何在没有任何 .xml 配置的情况下使用 spring 3.X 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21059171/