java - 如何在没有任何 .xml 配置的情况下使用 spring 3.X 注释

标签 java multithreading spring annotations

我是 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/

相关文章:

android - 我需要一种从线程获取数据到另一个 Activity 的好方法

java - Swing repaint() 在循环或线程中不起作用

java - spring不使用RequestMappingHandlerMapping来映射请求

java - HTTP 状态 500 - 处理 JSP 页面时发生异常

java - 列表到字符串。安卓

java - Robotium 与 libGDX 查找 imageButton 索引

java - JComboBox 并不总是将值保存到 TableModel

multithreading - 如何使用 Log4perl 在多线程 Perl 应用程序中轮换日志文件

javascript - 将表单从 Angular JS 发送到 Spring

java - org.springframework.http.converter.HttpMessageNotReadableException 调用休息后调用时