这几天翻项目代码,发现处理用户任务的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