静态代理
(1)什么是静态代理
在程序中,一般在程序运行前,我们称为是静态的,只要是在运行过程中,我们都称为动态的。
静态代理是由程序员手工编写的,代理关系在程序运行之前就已经确立的。
(2)使用静态代理的要求
(1)代理类要和目标类具有相同的业务方法。
也就是说代理类是代表目标类和客户类进行联系的,目标类具备的一切
功能,代理类也应该具备。达到这个要求的方式有两种,一时让目标类和代理类实现相同的业务接口来进行约束,
二是让代理类和目标类继承同一个父类(但是这种方法的约束能力没有第一种的效果好)
目标类中的对象称为目标对象, 代理类中的对象,称为代理对象。
目标类中的方法称为是目标方法,代理类中的方法称为是代理方法
(2)代理类中应该含有目标对象的引用,这样方便代理方法调用目标对象的目标方法
(3)静态代理类中的目标对象,应该是被创建的,而不是通过参数从外部传入的,这样客户类只和代理类发生
联系,压根就不知到目标类是谁,起到的保护和隐藏目标类的功能。
(4)增强的过程,并没有发生在目标类,而是在代理类执行目标方法之前或者之后进行的增强。
(5)一般会有一些不是主业务的逻辑代码出现在目标类中,我们为了保证目标类中是纯净的业务逻辑,同时为了
提高代码的复用率,我们可以把这些方法单独抽取出来,并且用一个类来保存这些方法(最好设计成静态的)
然后,在代理类中,目标方法的前后都可以添加这些交叉业务逻辑,这个过程称为植入,把交叉业务逻辑植入到
主业务逻辑当中。
(3)实现
业务接口:
//代理方法
@Override
public void doOther() {
SystemUtil.doTx();
target.doOther();
SystemUtil.doLog();
}
(1)什么是静态代理
在程序中,一般在程序运行前,我们称为是静态的,只要是在运行过程中,我们都称为动态的。
静态代理是由程序员手工编写的,代理关系在程序运行之前就已经确立的。
(2)使用静态代理的要求
(1)代理类要和目标类具有相同的业务方法。
也就是说代理类是代表目标类和客户类进行联系的,目标类具备的一切
功能,代理类也应该具备。达到这个要求的方式有两种,一时让目标类和代理类实现相同的业务接口来进行约束,
二是让代理类和目标类继承同一个父类(但是这种方法的约束能力没有第一种的效果好)
目标类中的对象称为目标对象, 代理类中的对象,称为代理对象。
目标类中的方法称为是目标方法,代理类中的方法称为是代理方法
(2)代理类中应该含有目标对象的引用,这样方便代理方法调用目标对象的目标方法
(3)静态代理类中的目标对象,应该是被创建的,而不是通过参数从外部传入的,这样客户类只和代理类发生
联系,压根就不知到目标类是谁,起到的保护和隐藏目标类的功能。
(4)增强的过程,并没有发生在目标类,而是在代理类执行目标方法之前或者之后进行的增强。
(5)一般会有一些不是主业务的逻辑代码出现在目标类中,我们为了保证目标类中是纯净的业务逻辑,同时为了
提高代码的复用率,我们可以把这些方法单独抽取出来,并且用一个类来保存这些方法(最好设计成静态的)
然后,在代理类中,目标方法的前后都可以添加这些交叉业务逻辑,这个过程称为植入,把交叉业务逻辑植入到
主业务逻辑当中。
(3)实现
业务接口:
package com.abc.service;
//业务接口
public interface ISomeService {
String doSome(int a,String b);
void doOther();
}
public interface ISomeService {
String doSome(int a,String b);
void doOther();
}
业务接口的实现类(目标类):
package com.abc.service;
//目标类
public class SomeServiceImpl implements ISomeService {
//目标方法
public String doSome(int a, String b) {
System.out.println("执行业务方法doSome!");
return a+b;
}
//目标方法
@Override
public void doOther() {
System.out.println("执行业务方法doOther!");
}
public class SomeServiceImpl implements ISomeService {
//目标方法
public String doSome(int a, String b) {
System.out.println("执行业务方法doSome!");
return a+b;
}
//目标方法
@Override
public void doOther() {
System.out.println("执行业务方法doOther!");
}
}
//代理类
package com.abc.proxy;
import com.abc.service.ISomeService;
import com.abc.service.SomeServiceImpl;
import com.abc.utils.SystemUtil;
//代理类
public class ServiceProxy implements ISomeService {
private ISomeService target = new SomeServiceImpl();
//代理方法
@Override
public String doSome(int a, String b) {
//系统级服务
SystemUtil.doTx();
String result = target.doSome(a, b);
SystemUtil.doLog();
return result;
}
import com.abc.service.SomeServiceImpl;
import com.abc.utils.SystemUtil;
//代理类
public class ServiceProxy implements ISomeService {
private ISomeService target = new SomeServiceImpl();
//代理方法
@Override
public String doSome(int a, String b) {
//系统级服务
SystemUtil.doTx();
String result = target.doSome(a, b);
SystemUtil.doLog();
return result;
}
//代理方法
@Override
public void doOther() {
SystemUtil.doTx();
target.doOther();
SystemUtil.doLog();
}
}
//交叉业务逻辑
package com.abc.utils;
//系统级服务(交叉业务逻辑)
public class SystemUtil {
public class SystemUtil {
public static void doLog() {
System.out.println("记录日志");
}
//
public static void doTx() {
System.out.println("开启事务");
}
}
System.out.println("记录日志");
}
//
public static void doTx() {
System.out.println("开启事务");
}
}