javaweb 之 代理模式

Posted 叶碎夜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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路径下)

以上是关于javaweb 之 代理模式的主要内容,如果未能解决你的问题,请参考以下文章

Java 之 设计模式——代理模式

设计模式之动态代理模式

谈谈设计模式之代理模式

《设计模式之禅》之代理模式

23中设计模式之-代理模式

设计模式之代理模式详解和应用