day19_代理、注解

一、动态代理

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:策略(方案)设计模式的应用。如何代理?

InvocationHandler中的invoke方法:调用代理类的任何方法,此方法都会执行   

         Object proxy:代理对象本身的引用。一般用不着。

         Method method:当前调用的方法。

         Object[] args:当前方法用到的参数

1.3、AOP编程思想

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

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

day19_代理、注解

二、注解:

它不是注释 注释是程序员写的,给程序员的

注解给程序看,用于描述程序如何运行及在什么阶段来运行。

注解现在在实际开发中,最大的功能是用于替换配置文件

注解是jdk1.5的新特性

可以通过反射来让注解具有功能。

注解 @xxxx

2.1、自定义注解

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

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

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

c、@SuppressWarnings({ "unused", "deprecation" }):抑制程序中的警告。unused警告的类型。{}数组。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.以上类型的一维数组类型

角色1:注解的定义者

day19_代理、注解

角色2:注解的使用者

day19_代理、注解

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

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

模拟Junit的@Test

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、反射注解中的属性

day19_代理、注解

4、元注解

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

day19_代理、注解

什么是元注解:

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

  • @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.0web.xml已经不是必须的了。替代它的就是注解。

day19_代理、注解

四、类加载器

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

2、JVM中的类加载器:

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

负责加载JRE/lib/rt.jar(JDK中绝大部分的类)

ExtClassLoader:

负责加载JRE/lib/ext/*.jar

AppClassLoader:

负责加载在classpath环境变量中的所有类。

3、父类委托机制

day19_代理、注解

Class A extends HttpServlet

day19_代理、注解

day19_代理、注解