模拟AOP框架实现-1

110 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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();\
    }\
}