@Contextconfiguration(classes=xxx.class)但在后面@Autowired注解一直为空原因

        这个问题很奇怪的是:在跑测试单元的时候通过@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”这个目前用了网上的方法还没有尝试出来。

最终结论是:还是要多读书的,不能再乱来,坑自己。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值