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();
}
}
测试结果:
喝前摇一摇
喝汇源果汁
喝前摇一摇
喝果粒橙
spring得到所有Action类的更多相关文章
- 第五课 Struts的控制器【续】Action类的execute()方法
1.Action类的execute()方法: public ActionForward execute(ActionMapping mapping, ...
- fielderror里的fieldName代表的是jsp里的fieldName还是Action类的成员变量?(待解答)
1.值栈的Action对象中会有一个fielderror属性,代表着字段错误. fielderror是Map<String,List<String>>类型 例如下面的值栈里可看 ...
- Struts2中的Action类(解耦方式,耦合方式)
一.解耦方式 特点:对web资源进行了封装,便于单元测试. 实现:ActionContext和接口方式 1.ActionContext 特点:Action执行的上下文对象.保存了执行Action所需要 ...
- Action类中获取request等对象的方法
struts2中的action类中,SevletActionContext可以获取
- Action类为何要继承ActionSupport
Action类为何要继承ActionSupport 理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承com.open ...
- Action类为何要 extends ActionSupport
我做的时候,我的action是继承ActionSupport的 Struts 2的Action无须实现任何接口或继承任何类型,普通的POJO类就可以用做Action类,但是,我们为了方便实现Actio ...
- Spring 的优秀工具类盘点
文件资源操作 文件资源的操作是应用程序中常见的功能,如当上传一个文件后将其保存在特定目录下,从指定地址加载一个配置文件等等.我们一般使用 JDK 的 I/O 处理类完成这些操作,但对于一般的应用程序来 ...
- 实现Action类
实现Action类 1.Action类的作用: (1)封装HTTP的请求参数: (2)处理用户请求: (3)封装处理结果. 2.Action类是什么,在Action类中应该包含什么: Action类就 ...
- 关于JFace中的右键菜单Action类,ActgionGroup类,MenuManager类
Action类,ActionGroup类,MenuManager类介绍 SWT中菜单是Menu类,在前面章节中已经介绍过Menu类的使用. 菜单项用MeauItem类来实现.但是在实际开发中,同一种功 ...
随机推荐
- 1、Nginx集群tomcat
一.准备工作 下载nginx,http://nginx.org/,本文采用nginx-1.8.0,下载之后直接解压,免安装 下载tomcat,以配置3台tomcat服务器做负载均衡为例 二.修改tom ...
- 【java】类的初识
面向过程思想:强调的是功能行为 面向对象思想:不自己亲自做,将功能封装为对象,强调具备功能的对象,指挥对象实现各种功能.以后开发实际就是找对象使用对象,要是对象没有就创建对象并维护对象. 面向对象的三 ...
- Weekend Log 4.6
PHP相关 常用PHP编译 .\/configure 12 ./configure -prefix=/usr/local/php --with-config-file-path=/usr/local/ ...
- WebService安全性的几种实现方法【身份识别】
转:http://blog.csdn.net/yongping8204/article/details/8619577 WebService安全性的几种实现方法[身份识别] 标签: webservi ...
- 通过Word 2016 发布的内容
从Word 2007 开始就支持的功能的,第一次使用. 在cnBlogs.com的个人设置中允许使用客户端发布:https://i.cnblogs.com/Configure.aspx Word中配置 ...
- switch case语句重点概况
witch-case语句格式如下: switch(变量){ case 变量值1: //; break; case 变量值2: //...; break; ... case default: //... ...
- 【剑指offer】两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. public class Solution { Stack<Integer> stack ...
- 解析流中的Xml文件时,报错:java.net.MalformedURLException: no protocol
原来的代码: // 创建DocumentBuilder对象 DocumentBuilder b = a.newDocumentBuilder(); // 通过DocumentBuilder对象的par ...
- hadoop 完全分布式安装
一个完全的hadoop分布式安装至少需要3个zookeeper,3个journalnode,3个datanode,2个namenode组成. 也就是说需要11个节点,但是我云主机有限,只有3个,所以把 ...
- consul-template + nginx部署高可用负载均衡
一.Consul-Template简介 Consul-Template是基于Consul的自动替换配置文件的应用.在Consul-Template没出现之前,大家构建服务发现系统大多采用的是Zooke ...