一、问题及结论
公司有一块定时任务的代码,添加定时任务需要拷贝很多行,实际有用的业务逻辑只有一行,其他的都是记录任务的开始及完成状态。我便考虑用模板方法。经过测试,在抽象父类中直接注入,或者加事务,事务是生效的。看源码得知,spring获取代理对象时,是考虑了父类属性的。
二、测试案例
抽象父类
package com.lxm.order.service;
import com.lxm.order.dao.TbOrderDao;
import com.lxm.order.domain.TbOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
public abstract class TemplateMethodFatherTest {
@Autowired
protected TbOrderDao tbOrderDao;
@Transactional(rollbackFor = Exception.class)
public String save() {
a();
b();
a();
return "哈哈成功了";
}
public void a() {
TbOrder tbOrder = new TbOrder();
tbOrder.setOrderId(4L);
tbOrder.setUserId(1L);
int flag = tbOrderDao.insert(tbOrder);
int i = 10 / 0;
if (flag > 0) {
System.out.println("插入成功");
} else {
System.out.println("插入失败");
}
}
abstract void b();
}
子类
package com.lxm.order.service;
import com.lxm.order.domain.TbOrder;
import org.springframework.stereotype.Service;
@Service
public class TemplateMethodSonTest extends TemplateMethodFatherTest {
@Override
void b() {
TbOrder tbOrder = new TbOrder();
tbOrder.setOrderId(3L);
tbOrder.setUserId(1L);
int flag = tbOrderDao.insert(tbOrder);
// int i = 10 / 0;
if (flag > 0) {
System.out.println("插入成功");
} else {
System.out.println("插入失败");
}
}
}