Spring核心原理AOP

来源:互联网 发布:mac air使用教程视频 编辑:程序博客网 时间:2024/05/17 14:18

框架核心知识-反射,动态代理
1、动态语言,具备反射机制
a、运行时,判断任意一个对象所属类
b、构造任意一个类的对象实例
c、判断任意类所具备的成员变量和方法
d、调用任意类所具备的成员变量和方法
e、生成动态代理

2、java反射中,最核心的api:
java.lang.Class 代表一个类
java.lang.reflect.Method 代表类的方法
java.lang.reflect.Filed 代表类的成员变量
java.lang.reflect.Constructor 代表类的构造方法

3、Class类
正常:import导入-》通过new实例化-》取得实例化对象
反射:实例化对象-》getClass方法-》类的名称
类它既能够拿到属性方法和构造器
例子:

public class Person{    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class aop {    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {        Object obj=new Person();        Class clazz=obj.getClass();        System.out.println(clazz.getName()+"----"+clazz.getSimpleName());        try {            Method mSet = clazz.getMethod("setName",String.class);            try {                mSet.invoke(obj,"12345");            } catch (IllegalAccessException e) {                e.printStackTrace();            } catch (IllegalArgumentException e) {                e.printStackTrace();            } catch (InvocationTargetException e) {                e.printStackTrace();            }            Method mGet = clazz.getMethod("getName");            System.out.println(mGet.invoke(obj));        } catch (NoSuchMethodException e) {            e.printStackTrace();        } catch (SecurityException e) {            e.printStackTrace();        }    }}

Class的实例获取方式
1、类名.class
2、对象实例.getClass();
3、Class.forName()
4、classLoader.loadClass(“”)

类的加载过程
这里写图片描述

AOP Spring jdk (反射结合proxy)
动态代理,是指客户通过代理类调用其他对象的方法,并且在程序运行时根据需要动态的创建目标类的代理对象。

package aop;public interface Person {    public void sayHello();}
package aop;public class Student implements Person{    private String name="jkxqj";    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public void sayHello() {        System.out.println("大家好,我是"+name);    }}
package aop;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class ProxyHandler implements InvocationHandler{    private Object obj;    public ProxyHandler(Object obj){        this.obj=obj;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("调用前。。。");        Object result = method.invoke(this.obj, args);        System.out.println("调用后。。。");        return result;    }}
package aop;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;public class aop {    public static void main(String[] args) {        Person person=new Student();        InvocationHandler handler=new ProxyHandler(person);        Person p =(Person)Proxy.newProxyInstance(person.getClass().getClassLoader(),person.getClass().getInterfaces(), handler);        p.sayHello();    }}