spring中bean的获取方式总结

本文介绍了一种在使用Dubbo接口时遇到的问题及解决方案。作者需要从Redis获取数据并通过Dubbo接口传递给另一平台,但在获取Dubbo Bean时遇到了困难。文中详细对比了@Resource、@Autowired、ApplicationContext和BeanFactory等不同方式,并最终通过BeanFactory成功获取Bean。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中,我遇见了dubbo接口获取不到bean的情况。

我需要写一个线程,获取redis数据,然后用过dubbo接口将数据传给另一个平台。

我的做法是将redis配置成了一个队列,从redis获取或来的数据存放在队列里面。在项目启动的时候初始化redis队列。

获取redis的数据,存放在队列里,然后调用dubbo接口。

前面都蛮顺利,但是在dubbo这里需要获取bean的时候出问题了,我无论是用注解的方式还是用ApplicationContext获取对象都拿不到这个bean。

最后用BeanFactory终于获取到了这个bean。

下面,总结一下我用过的几种方式:

//方法1:jdk 获取的时候报空指针
@Resource
private IAccountManager accountManagerService;
//方法2:spring 
@Autowired
private IAccountManager accountManagerService;
//方法4
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"}); 	
IAccountManager accountManagerService=(IAccountManager) context.getBean("accountManagerService");
//方法5
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");  
IAccountManager accountManagerService = (IAccountManager)factory.getBean("accountManagerService"); 

比较一下几种方式:

@Resource和@Autowired的比较

1、@Resource是jdk提供的,@Autowired是spring提供的

2、@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;@Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用

ApplicationContext和BeanFactory的比较

1、对国际化支持

ApplicationContext接口扩展了MessageSource接口,因而提供了消息处理的功能(i18n或者国际化)。BeanFactory不支持。

2、事件机制(Event) 

ApplicationContext的事件机制主要通过ApplicationEvent和ApplicationListener这两个接口来提供的。即当ApplicationContext中发布一个事件的时,所有扩展了ApplicationListener的Bean都将会接受到这个事件,并进行相应的处理。 

3、.底层资源的访问

 ApplicationContext扩展了ResourceLoader(资源加载器)接口,从而可以用来加载多个Resource,而BeanFactory是没有扩展ResourceLoader 

4、对Web应用的支持 

BeanFactory通常以编程的方式被创建,ApplicationContext以声明的方式创建,如使用ContextLoader。当然你也可以使用ApplicationContext的实现之一来以编程的方式创建ApplicationContext实例 。

5、加载形式

BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题。而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误。

6、其他区别

BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值