SSM框架-AOP和cglib动态代理

企业面试题
面向过程编程思想? c 语言 c++
面向对象编程思想? java语言、

什么叫面向对象编程?
java语言去描述这个世界:归类:个体都有一个类
学生:张三-----》学生类-- 特征(成员属性):学号、姓名、年龄–功能(method方法):学习,阅读计算
王老师—》》老师类–特征:工号、工资、工龄、学科—功能:能力:教书、备课、
aop:面向切面编程思想?

与业务需求强相关的功能,是由自己来做,不是强相关的功能(权限、日志等),通过面向切面的方式找到代理人完成
引入
老师: 授课、
代理人(班长):点名、收发作业
JDK动态代理
1-编写teacher接口和实现类

public interface Teacher {

    //上课
    public void teach();

}
public class TeacherImpl implements  Teacher {
    @Override
    public void teach() {
        System.out.println("上课");
    }
}

2-编写切面类(目标类):编写需要代理的方法
//切面类:需要其他人帮忙做的事情

public class MyAspect {

    //点名
    public void callName(){
        System.out.println("点名");
    }

    //收发作业
    public void collectHomework(){
        System.out.println("收发作业");
    }


}

3-编写代理机制类:如何创建代理人/代理规则
//aop思想的是时候是没有用到框架;
//负责执行代理规则和创建代理人

public class JdkProxy implements InvocationHandler {

    private Teacher teacher;

    //创建代理人  proxy:代理  -被代理人 teacher
    public Object createProxy(Teacher teacher){
        this.teacher=teacher;
        ClassLoader loader=JdkProxy.class.getClassLoader();
        Class<?>[] interfaces=teacher.getClass().getInterfaces();
        return Proxy.newProxyInstance(loader,interfaces,this);
    }

    //制定代理方式和过程: 点名-上课-点名
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        MyAspect myAspect = new MyAspect();
        //点名
        myAspect.callName();
        //上课:由老师来上课
        Object o = method.invoke(teacher, args);
        //点名
        myAspect.callName();
        return o;
    } 

}

4-测试

public static void main(String[] args) {
        // 创建代理人
        JdkProxy jdkProxy= new JdkProxy();
        Teacher teacher=new TeacherImpl();
        //形成代理人
        Teacher miaomiao = (Teacher) jdkProxy.createProxy(teacher);


        //代理人代理老师,进行工作
        miaomiao.teach();
    }

cglib动态代理

1-编写老师接口和实现类

public interface Teacher {

    //上课
    public  void teach();
}

public class TeacherImpl implements Teacher {
    //老师上课
    public void teach() {
        System.out.println("上课");
    }
}

2-编写切面类

// 和老师主要工作不是密切相关的工作
public class MyAspect {

    //点名
    public  void callName(){
        System.out.println("点名");
    }

    //收发作业本
    public void  collectExerciseBook(){
        System.out.println("收发作业本");
    }


}

3-编写代理机制类

public class CglibProxy implements MethodInterceptor {


    //创建代理人
    public Object createProxy(Object o){

        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(o.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    //代理规则
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        MyAspect myAspect=new MyAspect();
        //前置增强
        myAspect.callName();
        //执行被代理类的方法
        Object object = methodProxy.invokeSuper(o, objects);

        //后置增强
        myAspect.callName();
        return object;
    }
}

4-测试

public static void main(String[] args) {
    //创建代理人
    CglibProxy cglibProxy = new CglibProxy();
    Teacher teacher=new TeacherImpl();
    Object proxy = cglibProxy.createProxy(teacher);

    //代理人代理的是老师,强转成老师
    Teacher teacher1 = (Teacher) proxy;
    teacher1.teach();
}

你可能感兴趣的:(SSM框架-AOP和cglib动态代理)