当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring 3. X注解没有任何. xml配置

秋兴思
2023-03-14

我是Spring的新手,我不喜欢使用.xml作为Spring配置。所以我想只使用注释。以下是我的测试代码,它在没有Spring的情况下运行良好,但是如果我使用DI并添加注释“@Resource”,我得到NullPointException,任何人都可以提供帮助,非常感谢。

我已经导入了相关的Spring罐。这是一个生产者-消费者案例,我想把资源库注入生产者和消费者。

Producer.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);
    }
}

异常消息:

线程“池-1-线程-2”中的异常 java.lang.NullPointer在测试中出现异常。消费者.run(消费者.java:14) at java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) at java.util.concurrent.ThreadExecutor$Worker.run(未知来源) at java.lang.Thread.run(未知来源) 线程 “池-1-线程-1” 中的异常 java.lang.NullPointerException at testbq.Producer.run(Producer.java:14) at java.util.concurrent.ThreadPoolExecutor.runworker(未知来源) at java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 java.lang.Thread.run(未知来源)

谢谢

共有2个答案

齐航
2023-03-14

你不能使用新的生产者(),因为它会创建一个新的生产者,根本不使用Spring。您需要将应用程序上下文作为注释上下文加载,并从上下文中加载 Producer

public class TestPC {
    public static void main(String[] args){
         ExecutorService aExecutor = Executors.newFixedThreadPool(2);

         ApplicationContext ctx = 
             new AnnotationConfigApplicationContext("your.package.com"); 

         Producer producer = ctx.getBean(Producer.class);
         Consumer consumer = ctx.getBean(Consumer.class);
         aExecutor.execute(productor);
         aExecutor.execute(consumer);
   }
}

您必须将 your.package.com 替换为生产者类和使用者类所在的基包。

阳兴文
2023-03-14

在搜索“无XML的Spring配置”或基于Java的Spring配置时,您可能已经在几分钟内自己弄清楚了。

您还没有定义任何由@Configuration注释的类托管的bean creatiion方法-因此Spring能够知道您实际要注入的内容。

@Configuration
// optional @ComponentScan(basePackages = {"name.your.package.here"}
public class AppConfig
{
    @Bean // or @Bean(name = "nameOfYourBean")
    public ResourcePool getResourcePool() 
    { 
        return new ResourcePool(); 
    }
}

然后,您应该在main方法中创建一个Spring上下文,并将AppConfig加载到您的上下文中:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfic.class);

高温高压

 类似资料:
  • 本文向大家介绍详解在Spring3中使用注解(@Scheduled)创建计划任务,包括了详解在Spring3中使用注解(@Scheduled)创建计划任务的使用技巧和注意事项,需要的朋友参考一下 Spring3中加强了注解的使用,其中计划任务也得到了增强,现在创建一个计划任务只需要两步就完成了: 创建一个Java类,添加一个无参无返回值的方法,在方法上用@Scheduled注解修饰一下; 在Spr

  • 问题内容: 我必须缺少一些确实显而易见的东西……我尝试按照此处的示例来解析一个简单的XML文件:http : //golang.org/src/pkg/encoding/xml/example_test.go 正如您将在底部看到的那样,没有映射任何属性或子元素-方向- 元帅或反元帅。据我所知,这几乎与上述example_test.go中所做的事情完全相同(我唯一能看到的区别是该测试中的类型在该函数

  • 问题内容: 我需要在Linux / OSX终端下使用“干净的” shell(例如bash),而无需任何用户配置,但是每次启动时,它都会从某些文件(例如〜/ .bashrc)中读取配置信息。每当我需要“干净”的外壳时,我都可以修改该文件,并在完成后将其还原,但是有没有更简单的方法来执行此操作,例如命令? 问题答案: 您可以传递和命令行选项: 您可以在手册页中找到有关这些选项的文档。

  • 问题内容: 我想知道使用shellscript解析XML文件的最佳方法是什么? 应该一个人手工做吗? 第三层图书馆是否存在? 如果您已经做到了,请告诉我您是如何做到的 问题答案: 您可以尝试xmllint xmllint程序解析一个或多个XML文件,这些文件在命令行上指定为xmlfile。根据选择的选项,它会打印各种类型的输出。这对于检测XML代码和XML解析器中的错误很有用 它允许您使用–pat

  • 问题内容: 如何解析XML,以及如何使用jQuery浏览结果?这是我的示例XML: 我想通过此路径找到节点-> -> -> ? 问题答案: 有此功能: 您可以像这样使用它: 如果您确实想要一个对象,则需要一个插件。

  • 我想创建一个完全不使用任何XMLs的Spring应用程序(不web.xml不context.xml或任何东西)。到目前为止,它似乎工作得很好,除了我的视图解析器有一些问题,我不能自己解决。 这是我的WebApplicationInitializer 还有我的spring配置 最后是我的控制器 位于。 因此,如果我在控制器中使用注释,那么控制器会给我响应“index”,因此我知道我的配置至少在某种程