spring得到所有Action类

时间:2023-03-09 15:56:19
spring得到所有Action类

1. 代理模式的作用

  将主要业务与次要业务进行松耦合组装。

2. 代理模式的本质

  监控行为特征

3. 案例

  (1)喝果粒果汁

    主要业务:喝果汁

    次要业务:喝前摇一摇

  (2)JDK代理模式实现

    接口:定义所有需要被监听行为

    接口实现类:农夫果粒,果粒橙

    通知类:实现次要业务,当前被拦截的主要业务与次要业务如何绑定执行

    代理对象

  示例:

  (1)创建接口

/*
*
* 只有需要被监控的行为才有资格
* 在这里声明
*
*/
public interface DrinkService {
public void drink();
}

 (2)接口实现类

public class Huiyuan implements DrinkService {
@Override
public void drink() {
System.out.println("喝汇源果汁");
}
}
public class Guolicheng implements DrinkService {
@Override
public void drink() {
System.out.println("喝果粒橙");
}
}

 (3)通知类

public class GuozhiInvocationHandler implements InvocationHandler {

    private DrinkService target;

    public GuozhiInvocationHandler(DrinkService target){
this.target = target;
} // invoke方法:在被监控行为将要执行时,会被JVM拦截,被监控行为和行为实现方会被作为参数输送invoke
// 这个被拦截方法是如何与当前次要业务方法绑定实现
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnValue = null; if("drink".equals(method.getName())){
yaoyiyao();
returnValue = method.invoke(target,args);
} return returnValue;
} private void yaoyiyao(){
System.out.println("喝前摇一摇");
}
}

  (4)代理类

public class ProxyFactory {

    public static DrinkService builder(Class clazz) throws IllegalAccessException, InstantiationException {

        //1.创建被监控实例对象
DrinkService target = (DrinkService) clazz.newInstance();
//2.创建一个通知对象
InvocationHandler adviser = new GuozhiInvocationHandler(target);
//3.向JVM申请负责监控target对象指定行为的监控对象(代理对象)
/*
* loader:被监控对象隶属的类文件在内存中真实地址
* interfaces:被监控对象隶属的类文件实现接口
* h:监控对象发现小明要执行被监控行为,应该有哪一个通知对象进行辅助
*/
DrinkService $proxy = (DrinkService) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),adviser);
return $proxy;
}
}

测试类:

public class TestDemo {
public static void main(String[] args) throws InstantiationException, IllegalAccessException { DrinkService huiyuan = ProxyFactory.builder(Huiyuan.class);
huiyuan.drink();
DrinkService guolicheng = ProxyFactory.builder(Guolicheng.class);
guolicheng.drink();
}
}

测试结果:

喝前摇一摇
喝汇源果汁
喝前摇一摇
喝果粒橙