javaweb 之 代理模式

一、动态代理

1.1、代理模式

什么是代理模式及其作用

Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

优点:

  • (1).  职责清晰  真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
  • (2).  代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了隐藏的作用和保护了目标对象的作用。
  • (3).  高扩展性

结构

  • 一个是真正的你要访问的对象(目标类),另一个是代理对象,真正对象与代理
  • 对象实现同一个接口,先访问代理类再访问真正要访问的对象。

1.2、动态代理

动态代理它可以直接给某一个目标对象生成一个代理对象,而不需要代理类存在。

动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象。

动态代理生成技术:

  1. jdk提供一个Proxy类可以直接给实现接口类的对象直接生成代理对象。
  2. cglib  (spring学习)

Java.lang.reflect.Proxy类可以直接生成一个代理对象

Proxy.newProxyInstance():产生代理类的实例。仅能代理实现至少一个接口的类

  • ClassLoader:类加载器。固定写法,和被代理类使用相同的类加载器即可。
  • Class[] interface:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。
  • InvocationHandler:策略(方案)设计模式的应用。如何代理?
    • nvocationHandler中的invoke方法:调用代理类的任何方法,此方法都会执行

      • Object proxy:代理对象本身的引用。一般用不着。
      • Method method:当前调用的方法。
      • Object[] args:当前方法用到的参数

1.3、AOP编程思想(切面编程)

1、问题:业务方法日后会很多,会有很多重复的代码

2、问题:已经存在很多的方法,并没有考虑到事务的问题,现在要求加上。

二、注解:

  • 注解它不是注释 注释是程序员写的,给程序员的
  • 注解给程序看,用于描述程序如何运行及在什么阶段来运行。

注解现在在实际开发中,最大的功能是用于替换配置文件。注解是jdk1.5的新特性,可以通过反射来让注解具有功能。

注解 @xxxx

2.1、自定义注解

1、JDK中的三个基本的注解:

a、@Override:检查子类确实是覆盖了父类的方法。

b、@Deprecated:说明已经过时了。

c、@SuppressWarnings({ "unused", "deprecation" }):抑制程序中的警告。unused警告的类型。{}数组。all抑制所有警告。

@SuppressWarnings("all")

2、自定义注解的语法:(肉体)

研究一下注解的本质

声明一个注解   @interface  注解名{}

public @interface MyAnnotation{}

注解它的本质就是一个接口,这个接口需要继承 Annotation接口。

public interface MyAnnotation extends java.lang.annotation.Annotation {

}

分析注解中的成员

注解本质上就是接口,接口中可以有属性方法

属性 : 例:int age();

关于注解的属性类型可以有哪些?

  1. 基本类型
  2. String
  3. 枚举类型
  4. 注解类型
  5. Class类型
  6. 以上类型的一维数组类型

注解:就是在你的程序代码中的某个位置加了一个标记而已。

3、注解的反射:(灵魂)

a、反射注解类

java.lang.reflect.AnnotatedElement:

  1. <T extends Annotation> T getAnnotation(Class<T> annotationType):得到指定类型的注解引用。没有返回null。
  2. Annotation[] getAnnotations():得到所有的注解,包含从父类继承下来的。
  3. Annotation[] getDeclaredAnnotations():得到自己身上的注解。
  4. boolean isAnnotationPresent(Class<? extends Annotation> annotationType):判断指定的注解有没有。

Class、Method、Field、Constructor等实现了AnnotatedElement接口.

如:Class.isAnnotationPresent(MyTest.class):判断类上面有没有@MyTest注解;

Method.isAnnotationPresent(MyTest.class):判断方法上面有没有@MyTest注解。

b、反射注解中的属性

4、元注解

a、自定义的注解的存活范围(生命周期):默认是CLASS。

什么是元注解:

只能用在注解上的注解叫做元注解。(即:用于修饰注解的注解)

@Retention:作用。改变自定义的注解的存活范围。

  • RetentionPolicy:
  • SOURCE
  • CLASS
  • RUNTIME

@Target:作用,指定该注解能用在什么地方。

  • ElementType:
  • TYPE:
  • METHOD:
  • FIELD:
  • ANNOTATION_TYPE

@Documented:作用,使用了@MyTest的注解的类,如果@MyTest注解上面有@Documented注解,那么使用了@MyTest的注解的类的API文档中会出现@MyTest的身影。

@Inherited:作用,说明该注解可以被继承下去。

三、简单介绍Servlet3.0中的几个注解

增加注解的支持。

Servlet3.0:

  Tomcat7+;JDK6.0+;  

Servlet3.0:web.xml已经不是必须的了。替代它的就是注解。

四、类加载器

1、作用:负责把磁盘上的class文件加载到JVM中,Class引用字节码

2、JVM中的类加载器:

  1. BootStrap:老大。类加载器的祖先。 打印它会得到null。

    • 负责加载JRE/lib/rt.jar(JDK中绝大部分的类)
  2. ExtClassLoader:负责加载JRE/lib/ext/*.jar
  3. AppClassLoader:负责加载在classpath环境变量中的所有类。

3、父类委托机制

Class A extends HttpServlet  找到A后再往上找 (自己写的类要放在classpath路径下)

原文地址:https://www.cnblogs.com/lzhh/p/javaweb_4.html

时间: 2024-10-04 20:46:25

javaweb 之 代理模式的相关文章

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

拦截器的设计思想——代理模式

代理模式:静态代理和动态代理 1.代理类和被代理类必须实现同一个借口 2.代理类和别代理类有一种关联关系 静态代理: 例如实现一个日志: //定义一个接口 public interface UserDao{ public void delete(); } //定义一个实现类 public class UserDaoImpl implements UserDao{ public void delete(){ System.out.pritln("成功删除"); } } //定义一个代理类

Java设计模式——代理模式

前言: 上一篇说到了策略模式.单类图上来说,它和本篇要说的代理模式还真是有些像似.都需要一个公共的接口,还有一些实现类.代理类(包装类)封装了一个接口对象,提供客户端调用.这些都很类似.不过,有一个细节需要我们注意一下,那就是这里的代理类也需要去继承这里的公共接口.而在策略模式中,包装类则不需要这么做. 概述: 代理模式就是定义一个原对象的代理对象,来帮助原对象和系统之外的业务作沟通.也就是说,如果我们不能直接或是不愿直接去使用原对象,那么我们就可以使用创建一个原对象的代理来进行操作. 本文链接

代理模式(Proxy)

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉及到的角色有 抽象角色:声明真实对象和代理对象的共工接口 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装. 真实角色:代理角色所代表的真实对

深刻理解代理模式在java中如何优化系统性能

最近参与实习公司的项目迭代,项目中需要实现系统的快速响应和大量数据处理.在不断的学习中获得一点儿心得,先记录下来.慢慢的修改! 关于代理模式的知识和简单应用之前的学习笔记中已经有记录了,可以复习一下.这里主要记录如何使用代理模式来实现延迟加载,进而提升系统系能和反应速度. 使用代理模式实现延迟加载的一个简单实例: 需求:项目中对系统的启动速度做了一定的要求 我们在系统首次加载时,因为不需要实际的数据来构造显示界面,这就为我们实现系统首次加载的快速响应提供了可能.在常规模式下,我们一般会在系统启动

使用反射机制调用属性和私有成员与代理模式的介绍

使用反射机制调用属性: 通过反射机制可以获得类的属性,获得到的属性同样的可以进行赋值.得值操作,调用getField方法并传递属性的名称可以获得[学Java,到凯哥学堂kaige123.com]指定的属性,调用getFields方法则可以获得全部属性,但是这种方式不能获得私有属性: 代码示例: Student类示例: 运行结果: 从运行结果可以看出只拿出了公开的属性,私有的属性拿不到. 使用反射机制调用私有成员: 1.调用私有属性 在反射机制里调用私有属性需要通过getDeclaredField

动态代理模式

动态代理模式简介: 动态代理能够自动监听代理对象的方法,并且能够自动生成代理类的代码,这样就不需要我们自己去重写代理对象里的方法了,这样解决了代理类代码因业务庞大而庞大的问题,因为动态代理模式会在代码运行时根据代码来在内存中动态生成一个代理类自动重写代理对象[学Java,到凯哥学堂kaige123.com]的方法,然后这个动态代理类再调用处理类里的代码,处理类再调用到实际方法上去.而且我们可以选择性的监听代理对象的方法,有些不需监听的方法就可以在处理类中过滤掉.所以动态代理的优势就在于可以自动的

设计模式(十四):代理模式

一.概述 代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问.其实就是代理就是做到类似转发的功能,针对不同代理,转发的具体实现不同. 二.解决问题 从原理知道他就是控制客户对一个对象的访问,它跟现实中的中介代理类似,只是作为代表做一些受理工作,真正执行的并不是它自己.比如买火车票,外面有很多火车票代理点,我们直接去代理点买票就好而不用跑到火车票买了(暂时不考虑网购哈). 三.结构类图 四.应用实例 在这个例子中,主要讲解远程代理,它可以作为另一个JVM上的本地代表.客户端调用代理的方

设计模式之代理模式

代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问.使用场合,第一,远程代理,也就是为一个对象在不同的地址空间提供局部代表.这样可以隐藏一个对象存在于不同地址空间的事实:第二,虚拟代理,是根据需要创建开销很大的对象.通过它来存在实例化需要很长时间的真实对象:第三,安全代理,用来控制真实对象访问时的权限:第四,智能指引,是指当调用真实的对象时,代理处理另外一些事情.代理模式与外观模式有点像,但外观模式中外观与实体不一定具备相同的接口,两者都在一定程度上隐藏了系统的复杂性. 代理模式