这个问题很奇怪的是:在跑测试单元的时候通过@ContextConfiguration(classes=xxx.class),然后再通过@Autowired注解后,是可以成功获得对象的。但是当我在dubbo项目中也想通过这样的方式直接获得对象,但是发现不可行,一开始以为可能和下面这篇博文写的有关(Spring整理系列(16)——通过单元测试理解spring容器以及dubbo+zookeeper单元测试异常处理),即既然测试单元的spring容器与主项目的容器是隔离的,那么现在注入失败可能会有两个原因:
1、没有加载spring容器,2、这个bean没有加载到spring容器中。
如果是这个bean没有加载到spring容器中则它的修改步骤如下:
(1)、在applicationContext中添加对应的命名空间,在schemaLocation中需要指定schema:
“<beans ……
xmlns:context="http://www.springframework.org/schema/beans"
xsi:schemationLocation="……
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"
/>”
(2)、在applicationContext中添加<context:component-scan base-package="类路径">
使得spring可以自动去扫描base-package下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean
在上述步骤都做了的情况下,那就是获取对象的方式不对,于是去官方文档关于看了@ContextConfiguration这个注解,发现它是用于"定义类级元数据,用于确定如何为集成测试加载和配置ApplicationContext"。。。
最终在主程序中通过SpringContainer.getContext().getBean(XXX.class)的方式成功获取对象,至于之前用了@Autowired为什么不能注解成功,这个看了一些出现类似问题的文章,发现这篇文章和我的情况是相似的(Spring使用@Resource、@Autowired注入时出现空指针问题的原因)即:
Spring默认都是单例的,new出来的对象,Spring依然不会对它进行装配,只有通过Spring创建的对象才会获得自动装配的功能。
我的代码类似于:
@ComponentScan("package of xxx class ")public xxx class{ private A a; @PostConstruct public void start(){ this.a = new A(); } @Bean public A a(){ return this.a; }}public class A{}//这个是在A.java方法里面不知道对我这个错误的理解对不对,改天问问大神。而具体要如何“使用new方法创建的对象可以引用spring管理的bean”这个目前用了网上的方法还没有尝试出来。
最终结论是:还是要多读书的,不能再乱来,坑自己。