TaskServiceImpl代码分析(理解afterPropertiesSet()和getBeansOfType()方法)

这几天翻项目代码,发现处理用户任务的TaskServiceImpl写的很好,今天有时间好好研究下里面的知识点。

源码如下:

@Service
@Transactional(readOnly = true)
public class TaskServiceImpl implements TaskService, ApplicationContextAware, InitializingBean {
	private ApplicationContext appContext;
	List<UserTaskProcessor> processors = Lists.newArrayList();

	@Override
	@Transactional
	public void process(int taskCode, long userId, Map<String, Object> params) {
		if (taskCode > 0) {
			UserTaskProcessor processor = getProcessor(taskCode);
			UserTask userTask = processor.getUserTask(taskCode, userId, params);
			if (userTask != null && userTask.getStatus() == UserTaskStatus.OPEN) {
				processor.process(userTask, userId, params);
			}
		}
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		appContext = applicationContext;
	}

	UserTaskProcessor getProcessor(int code) {
		UserTaskProcessor processor = null;
		for (UserTaskProcessor p : processors) {
			if (p.accept(code)) {
				processor = p;
			}
		}
		return processor;
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		for (UserTaskProcessor processor : appContext.getBeansOfType(UserTaskProcessor.class).values()) {
			processors.add(processor);
		}
	}

}
知识点1:appContext.getBeansOfType()方法。

该方法返回一个map类型的实例,map中的key为bean的名字,key对应的内容未bean的实例。

该方法有两种类型的重载:
getBeansOfType(Class),获取某一类的所有的bean。

getBeansOfType(Class,boolean,boolean),后面两个布尔值,第一代表是否也包含原型(Class祖先)bean或者或者只是singletons(包含FactoryBean生成的),第二个表示是否立即实例化懒加载或者由FactoryBean生成的Bean以保证依赖关系。

在TaskServiceImpl中,我们通过这个方法取得所有继承UserTaskProcessor接口的bean,然后通过accept(code)方法判断具体调用哪个实例化的bean。

知识点2:

afterPropertiesSet()方法。

初始化bean的时候执行该方法,前提是实现InitializingBean接口。

实现类似功能的还有init-method方法,需要在需要在applicationContext.xml配置文档中bean的定义里头写明。例如:<bean id="TestBean" class="xxx.util.TestBean" init-method="init"></bean>,初始化的时候会执行TestBean的init方法。

执行顺序:先执行afterPropertiesSet()方法,然后执行init-method()方法。

不过init-method()方法需要在配置文件配置,和现在普遍使用注解不符。

还有一个@postconstruct注解也有类似功能。

相反的DisposableBean提供销毁前的调用方法。

这边涉及到spring中bean的生命周期,有两篇文章参考。

http://sexycoding.iteye.com/blog/1046775

http://sexycoding.iteye.com/blog/1046993


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值