您的位置:首页 > 编程语言 > Java开发

spring学习(五):aop的设计由来之静态代理

2017-05-06 14:33 316 查看
静态代理:
抽象角色:一般使用接口或者抽象类实现。在这里就是rent接口
真实角色:代表干事情的人,也就是被代理的人,他不关注一些公共复杂的事情,在这里就是房东。

代理角色: 代理真实角色的人,代理真实角色后一般会做一些附属操作,在这里就是中介。

(一)先给大家理解下什么事抽象角色,真实角色,代理角色。

1.客户租房,我们首先得找一个中介,中介对应了房东
public class Client {
public static void main(String[] args) {
Host host = new Host();//房东
Proxy proxy = new Proxy(host);//中介

proxy.rent();
}
}

2.租房接口
public interface Rent {
public void rent();
}
2.房东实现Rent接口
public class Host implements Rent{
public void rent(){
System.out.println("房屋出租");
}
}

3.中介实现Rent接口
public class Proxy implements Rent{
private Host host;//中介要房东授权才能租房,所以要引用房东
public Proxy() {
}
public Proxy(Host host) {
this.host = host;
}
public void setHost(Host host) {
this.host = host;
}
//租房
public void rent(){
seeHouse();
host.rent();
fare();
}
//看房
private void seeHouse(){
System.out.println("带房客看房");
}
//收中介费
private void fare(){
System.out.println("收取中介费");
}
}


理解了这几个名词的含义了,肯定缺不了来一波代码。

(二)在实际程序中的作用
(1)就拿在service层添加日志来举例,我们每执行一个方法都要添加日志,这样service层就添加了和增删改查操作不相关的代码(log),并且我们必须还得重复的添加log方法,这样就违背了我们上面说的不关注一些公共复杂的业务,代码
   userService接口

   
public interface UserService {
public void add();
public void update();
public void delete();
public void search();
}


   userService实现类

   
public class UserServiceImpl implements UserService {

@Override
public void add() {
//公共的业务----日志,安全,权限,缓存,事务等等
//A.log();---分离的思想--纸质阅读器;osgi--java模块开发-spring--osgi
log("add")
System.out.println("增加用户");
}

@Override
public void update() {
log("update")
System.out.println("修改用户");
}

@Override
public void delete() {
log("delete")
System.out.println("删除用户");
}

@Override
public void search() {
log("search")
System.out.println("查询用户");
}

public void log(String methodName){
System.out.println("执行"+methodName+"方法");
}

}


  (2)使用静态代理之后的代码
      添加静态代理

     
public class UserServiceProxy implements UserService{

private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
@Override
public void add() {
log("add");
userService.add();
}
@Override
public void delete() {
//日志,安全,缓存,事务,异常处理等
log("delete");
userService.delete();
}
@Override
public void search() {
log("search");
userService.search();
}
public void update() {
log("update");
userService.update();
}
public void log(String methodName){
System.out.println("执行"+methodName+"方法");
}

}


     修改userService实现类,这样userService实现类就只关注他需要关注的事情 

     
public class UserServiceImpl implements UserService {

@Override
public void add() {
//公共的业务----日志,安全,权限,缓存,事务等等
//A.log();---分离的思想--纸质阅读器;osgi--java模块开发-spring--osgi
System.out.println("增加用户");
}

@Override
public void update() {

System.out.println("修改用户");
}

@Override
public void delete() {

System.out.println("删除用户");
}

@Override
public void search() {

System.out.println("查询用户");
}

}
  

好处:使得真实角色要处理的业务很纯粹,不再去关注一些公共复杂的事情,租房就只租房,不用搞其他的,公共的业务由代理完

成,我们知道在dao层有很多事情是公共的,比如增,删,改都要加上事务,还有就是service层需要加日志,这种繁琐重复的事情,

假如每次增,删,改操作我们都要加事务,这样就很麻烦。加上静态代理就能使公共业务扩展变得更加集中。

缺点:增加了代理类,工作流变大了,开发效率太低了,所以就出现了动态代理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: