zoukankan      html  css  js  c++  java
  • 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路径下)

  • 相关阅读:
    输出1-100 , 奇数偶数分别添加标识(for循环语句嵌套if-else语句)
    输出 1-100 内的奇数和偶数,并对其分别求和(while嵌套if-else循环)
    1至100累加求和问题
    淡旺季机票的价格问题(switch语句与if-else语句嵌套)
    (折扣计算)需求说明:普通顾客购物满100元打9折;会员购物打8折;会员购物满200元打7.5折(判断语句if-else和switch语句的嵌套结
    随机产生1-12的整数 , 根据产生整数输出一下该月份的季节信息(Math.random()和if语句的应用)
    在Hibernate单向一对多关联关系中的org.hibernate.StaleStateException 异常。
    关于Hibernate的报错org.hibernate.MappingException: Unknown entity
    Hibernate多对一关联关系
    关于映射异常org.hibernate.MappingException: An association from the table DUTY_INFO refers to an unmapped class: com.pms.entities.other.Department的原因。
  • 原文地址:https://www.cnblogs.com/lzhh/p/javaweb_4.html
Copyright © 2011-2022 走看看