Spring aop原理

来源:互联网 发布:剃头软件叫什么 编辑:程序博客网 时间:2024/05/17 08:32

1、aop概念
(1)aop:面向切面编程,扩展功能不修改源码实现
(2)aop采取横向抽取机制,取代传统的纵向继承体系重复性代码。
2、aop原理
这里写图片描述

这里写图片描述

4、底层实现演示

//接口类public interface UserService {    void add();    void update();    void delete();}
//实现类public class UserServiceImpl implements UserService{    @Override    public void add(User user) {        // TODO Auto-generated method stub        System.out.println("add.....");    }    @Override    public void update(User user) {        // TODO Auto-generated method stub        System.out.println("update.....");    }    @Override    public void delete(Integer id) {        // TODO Auto-generated method stub        System.out.println("delete.....");    }}
//切面类public class MyAspect {    public void before(){        System.out.println("before....");    }    public void after(){        System.out.println("after....");    }}
/*** 工厂类,在spring中已经帮我们封装好* 主要作用是:利用代理对象,对对象中的方法进行增强**/public class MyBeanFactory {    public static UserService createService() {        // 目标类        final UserService userService = new UserServiceImpl();        final MyAspect myAspect = new MyAspect();        /**         * 生成并返回一个代理类         * 参数1:类加载器         * 参数2:代理类需要的所有接口,目标类实例,getClass().getInterface()         * 参数3:提供invoke方法,代理对象每次执行方法的时候都会调用一次invoke方法         **/        UserService proxyService = (UserService) Proxy.newProxyInstance(                //获取类加载器,随便一个类都可以,一般选择当前类                MyBeanFactory.class.getClassLoader(),                 //获取目标对象的接口                userService.getClass().getInterfaces(),                 //                new InvocationHandler() {                    /**                     * Object proxy:代理对象                     * Method method:代理对象执行方法所调用的方法                     * Object[] args:方法执行执行的实参                     */                    @Override                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                        // TODO Auto-generated method stub                        myAspect.before();                        System.out.println("args:"+args.toString());                        //要用一个对象接住                        Object object = method.invoke(userService, args);                        myAspect.after();                        return object;                    }                });        return proxyService;    }}