持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
3. 模拟AOP框架实现
主要的目的是进行业务逻辑与切面的解耦合。完全分离业务逻辑和切面。
分为五个版本:
1)版本一:业务和切面紧耦合在一起。
2)版本二:子类代理实现切面功能增强。
3)版本三:使用静态代理分离业务。
4)版本四:使用静态代理分离业务和切面。
5)版本五:使用动态代理优化业务和切面的解耦合。
3.1 代码实现版本一
public class BookServiceImpl {\
public void buy(){\
try {\
//切面部分:事务处理\
System.*out*.println("事务开启......");\
//主业务实现\
System.*out*.println("图书购买业务的实现............");\
//切面部分:事务处理\
System.*out*.println("事务提交......");\
} catch (Exception e) {\
//切面部分:事务处理\
System.*out*.println("事务回滚..........");\
}\
}\
}
3.2 代码实现版本二
public class BookServiceImpl {\
public void buy(){\
//实现主业务功能\
System.*out*.println("图书购买业务的实现...........");\
}\
}
public class SubBookServiceImpl extends BookServiceImpl {\
//重写父类的业务方法,增强切面(事务)的功能\
@Override\
public void buy() {\
try {\
//切面部分:\
System.*out*.println("事务开启................");\
super.buy();\
//切面部分:\
System.*out*.println("事务提交................");\
} catch (Exception e) {\
//切面部分:\
System.*out*.println("事务回滚................");\
}\
}\
}
3.3 代码实现版本三
public interface Service {\
public void buy();\
}
public class BookServiceImpl implements Service {\
@Override\
public void buy() {\
//只要完成主业务功能就行\
System.*out*.println("图书购买业务实现...............");\
}\
}
public class ProductServiceImpl implements Service{\
@Override\
public void buy() {\
System.*out*.println("商品购买业务实现..............");\
}\
}
public class Agent implements Service {\
//上接口上灵活,目标对象灵活切换\
public Service target;\
//使用构造方法传入目标对象\
public Agent(Service target){\
this.target = target;\
}\
@Override\
public void buy() {\
try {\
//切面功能实现\
System.*out*.println("事务开启...........");\
//业务功能实现\
target.buy();\
//切面功能实现\
System.*out*.println("事务提交");\
} catch (Exception e) {\
System.*out*.println("事务回滚.............");\
}\
}\
}
public class MyTest03 {\
@Test\
public void test03(){\
Service service = new Agent(new ProductServiceImpl());\
service.buy();\
}\
}