Java基础之面向切面编程(AOP)

目录

 1. 切面是什么

2. 切面编程

3. IoC和DI   


 1. 切面是什么

        面向切面编程中,切面就是可以加入到源功能位置中的代码。

        代理模式下(try--catch)哪些地方可以加切面:

        每一行代码最完整的结构如下:

try{

}catch(Exception e){

}finally{

}

        有一行代码加入到这个结构中时:参加代码的位置就是固定的4个

try{

前();

//代码;

后();

}catch(Exception e){

异常();

}finally{

最终();

}

2. 切面编程

2.1 编写切面接口

        在这个接口编写4个方法,分别对应4个位置。

public interface AOP {
    void before();//前
    void after();//后
    void exception();//异常
    void finall();//最终
}

2.2 修改代理类加入切面方法

public class ProxyImpl implements Proxy {
    private Proxy proxyTarget;//目标对象。被代理对象
    private AOP aop;//代理的内容
    public ProxyImpl(Proxy proxyTarget, AOP aop) {
        this.proxyTarget = proxyTarget;
        this.aop = aop;
    }
    @Override
    public void fun() {
        try {
            aop.before();
            proxyTarget.fun();
            aop.after();
        }catch (Exception e){
            e.printStackTrace();
            aop.exception();
        }finally{
            aop.finall();
        }
    }

2.3 编写AOP的实现类

/**
 * 事务切面的实现类
 */
public class AOPImpl implements AOP {
    @Override
    public void before() {
        System.out.println("打开事务!");
    }
    public void after() {
        System.out.println("提交事务!");
    }
    @Override
    public void exception() {
        System.out.println("回滚事务!");
    }
    @Override
    public void finall() {
    }
}

 2.4 编写测试类

被代理对象 和 代理内容 都交给 代理对象

public static void main(String[] args) {
    Service service = new Service();//被代理对象。
    AOPImpl aop = new AOPImpl();//代理内容
    ProxyImpl proxyImpl = new ProxyImpl(service,aop);//代理对象
    proxyImpl.fun();
}

3. IoC和DI   

        service 业务层 ;dao 数据访问层。service 依赖于 dao

        IoC:控制反转:service获取dao对象的方式。

        DI:依赖注入。

3.1 主动获取

        在Service类中使用new关键字。创建了一个依赖的DAO对象。

        Service类使用哪一个DAO,是在Serivce类中自己说了算的。

public class DAO {
}

public class Service {
    private DAO dao = new DAO();
}

        问题:耦合度太高

3.2 被动接收

        降低耦合度:删除new;创建接口。

public interface DAO {
}

public class DAOImpl implements DAO {
}

public class Service {
    private DAO dao;
    public void setDao(DAO dao) {
        this.dao = dao;
    }
}

        现在Service使用哪一个DAO的实现类,Service自己说了不算

        IoC:控制反转。从原来的 主动获取  变成 现在的 被动接收。控制权发了改变。

public static void main(String[] args) {
    Service service = new Service();
    DAOImpl daoImpl = new DAOImpl();
    service.setDao(daoImpl);//依赖注入
}

        DI:依赖注入。外部通过 指定的方法 为Service类注入依赖关系对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值