目录
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 { |
问题:耦合度太高。
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类注入依赖关系对象。