AOP(Aspect Oriented Programmimg) 面向切面编程
核心:spring中的代理设计模式
1.静态代理设计模式
service
核心:
核心功能:一定要有的功能,没有的话业务将无法进行
书写业务逻辑代码
额外功能:核心功能基础之上添加的功能(可有可无)
调用DAO
额外:
控制事务
在service层中应不应该写额外功能?
业务调用者:
service中应该有额外功能,没有额外功能,业务将面临风险
代码设计者:
service中不应该有额外功能,违反了Java中的各司其职性,额外功能经常被修改,不免影响到核心功能
矛盾:静态代理模式进行解决
生活案例:租房
房东类
package com.hp.proxy;
/**
* 房东 出租角色
*/
public class Landlord implements Rent{
@Override
public void rent() {
System.out.println("我是房东 我房屋租出");
}
}
代理类 中介
package com.hp.proxy;
/**
* 代理角色 房屋中介
*/
public class HousingAgency implements Rent{
private Rent rent;
public HousingAgency() {
}
public HousingAgency(Rent rent) {
this.rent = rent;
}
@Override
public void rent() {
// 看房
look();
// 合同
contract();
// 收费
moneys();
// 转交房租
give();
// 成功租房
rent.rent();
}
/**
* 看房
* @return boolean
*/
private boolean look(){
System.out.println("中介带房客看房,房客觉得可以");
return true;
}
/**
* 签合同
* @return boolean
*/
private boolean contract(){
System.out.println("签合同,如果没有霸王条款则正常签订");
return true;
}
/**
* 交钱
* @return boolean
*/
private boolean moneys(){
System.out.println("签订完合同交房租");
return true;
}
/**
* 中介将房租转给房东
* @return 返回一张收据
*/
private String give(){
System.out.println("转交房租给房东");
return "房东已收到钱";
}
}
租房
package com.hp.proxy;
public interface Rent {
// 出租房屋方法
public void rent();
}
package com.hp.proxy;
/**
* 房客 承租角色
*/
public class Tenant {
public static void main(String[] args) {
// 创建真实的房东对象
Landlord landlord = new Landlord();
// 创建代理对象并代理房东出租
HousingAgency housingAgency = new HousingAgency(landlord);
// 将房屋出租
housingAgency.rent();
}
}
静态代理中的概念:
原始类:只负责核心功能的类
原始方法:原始类中的方法
代理类:给原始类添加额外功能的类
静态代理的本质:
代理类只负责额外功能,原始类只负责核心功能,通过代理类为原始类增加额外功能
静态代理的缺点
①类过载
有一个原始类,就需要写一个代理类,造成类过载
②额外功能代码冗余,不利于项目的维护