2020-02-26

Days13Spring的AOP

今天是千锋线上学习的第13天,早上上课老师将昨天学习的maven和Spring初识复习一遍。紧接着就马不停蹄的开始了今天的课程——Spring的AOP。
首先一点要区分三个概念:
类, 对象, 类对象
以用户(User)为例:
User u = new User();
User为一个类
u为一个User类的对象
User.class是User的类对象

1.IUserService.java
package com.qfedu.aop01;
import java.util.List;
public interface IUserService {
    /**
     * 获取所有的用户对象列表
     * @return
     */
    List getAllUser();
    /**
     * 保存用户
     * @param user
     * @return
     */
    boolean saveUser(T user);
    /**
     * 根据用户uid删除该uid对应的用户信息
     * @param uid
     * @return
     */
    boolean deleteUser(int uid);
    /**
     * 更新指定用户信息
     * @param obj
     * @return
     */
    boolean updateUser(T obj);
}
2.UserFactory.java
package com.qfedu.aop01;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class UserFactory {

    public static IUserService getUserService(){

        IUserService us = new UserservcieImpl();

        MyAspect ma = new MyAspect();

        /**
         * 
         *  使用Proxy类的静态方法newProxyInstance来实现对于目标对象us的代理
         *  目的是在原本us可以做的事情之前和之后可以做额外的事情
         * 
         */
        IUserService ius = (IUserService) Proxy.newProxyInstance(UserFactory.class.getClassLoader(), us.getClass().getInterfaces(), new InvocationHandler() {

            /**
             * 代理对象调用的回掉方法
             * @param proxy 代理对象
             * @param method 被代理的方法
             * @param args 被代理方法的参数列表对象
             * @return 每个方法的最终返回值
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                ma.before();

                System.out.println("000000000" + method);
                System.out.println("000001111" + args);

                Object obj = method.invoke(us, args);

                ma.after();

                System.out.println("111111111" + obj);
                return obj;
            }
        });

        return ius;
    }
}
3.UserFactory.java
package com.qfedu.aop02;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class UserFactory {

    /**
     * 使用Spring中的一个增强类来实现aop方式
     *      1.  创建Enhancer对象
     *      2.  设置增强类Enhancer的superClass
     *      3.  设置Enhancer对象的回调
     *      4.  通过eh对象的create()方法来得到指定的对象
     * @return
     */
    public static IUserService getUserService(){
        //  1.  创建Enhancer对象
        Enhancer eh = new Enhancer();

        //  2.  设置增强类Enhancer的superClass
        eh.setSuperclass(IUserService.class);

        IUserService us = new UserServiceImpl<>();

        MyAspect ma = new MyAspect();

        //  3.  设置Enhancer对象的回调
        eh.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

                ma.before();

                Object obj = method.invoke(us, objects);

                ma.after();

                return obj;
            }
        });

        //  4.  通过eh对象的create()方法来得到指定的对象
        IUserService ius = (IUserService) eh.create();

        return ius;
    }
}

通过课上内容的学习,以及作业的练习让我对SpringAOP有了一定的认识,同时对maven也有了一定的巩固。最后送每一个为自己未来奋斗的人一句话:既然选择 了远方,便只顾风雨兼程!

你可能感兴趣的:(2020-02-26)