• Spring中的AOP


    Spring为Java大地带来了一阵春风,它作为一个优秀的轻量级企业应用开发框架,能够大大简化企业应用开发的复杂性。
    Spring以反向控制和AOP这两样先进的设计理念为基础,统一了应用对象的查找、配置和生命周期的管理,分离了业务与基础服务中的不同关注
    点,开发人员可以基于简单Java对象轻松的实现与EJB同样强大的功能。
    AOP经常被定义为一种编程技术,用来在系统中提升业务的分离,系统有很多组件组成,每一组件负责一部分功能。然而,这些组件也经常带有一些除了核心功能之外的附带功能。系统服务如日志、事务管理和安全经常融入到一些其他功能模块中。这些系统服务通常叫做交叉业务,这是因为,它们总是分布在系统的很多组件中,通过将这些业务分布在多个组件中,你给你的代码引入了双重复杂性。
               ---摘自《Spring in Action》
     

    学习Spring AOP 之前,先要了解下JAVA的动态代理。如果不清楚动态代理的概念就百度一下吧。废话不多说,直接上代码。

    我们模拟一个简单的登录

    首先我们创建一个用户登录的接口

    1
    2
    3
    4
    5
    package com.proxy.test;
     
    public interface UserLogin {
        public void login(String userName);
    }

    接着创建一个接口的实现类

    1
    2
    3
    4
    5
    6
    7
    package com.proxy.test;
     
    public class UserLoginImpl implements UserLogin {
        public void login(String userName) {
            System.out.println("欢迎 " + userName + " 登录系统");
        }
    }

    在创建一个自己的处理类 实现InvocationHandler 接口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    package com.proxy.test;
     
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
     
    public class MyHandler implements InvocationHandler {
        private Object obj;
     
        public MyHandler(Object obj) {
            this.obj = obj;
        }
     
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            beforeLogin(); // 登录前处理,更具自己需要来写
     
            Object result = method.invoke(obj, args); // 调用真正的方法
     
            afterLogin(); // 登录后处理,更具自己需要来写
     
            return result;
        }
     
        public void beforeLogin() {
            System.out.println("登录前处理");
        }
     
        public void afterLogin() {
            System.out.println("登录后处理");
        }
    }

    最后写一个测试类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package com.proxy.test;
     
    import java.lang.reflect.Proxy;
     
    public class ProxyTest {
        public static void main(String[] args) {
            UserLoginImpl user = new UserLoginImpl(); // 得到实例对象
            MyHandler handler = new MyHandler(user); // 将对象传入自己的处理器中
     
            UserLogin proxy = (UserLogin) Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass()
                    .getInterfaces(), handler); // 得到代理对象
     
            proxy.login("张三"); // 代理调用login方法
        }
    }

    运行结果 输出 :

    登录前处理
    欢迎 张三 登录系统
    登录后处理
    说明我们的动态代理成功了。以上就是一个动态代理的小例子。

  • 相关阅读:
    Spring使用Jackson处理json数据
    手工搭建web项目
    购物车模块
    C# ——利用反射动态加载dll
    C# —— 利用Marshal.GetDelegateForFunctionPointer 来转换一个函数指针为一个委托
    C# —— GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。
    c#——IntPtr
    C#-StructLayoutAttribute(结构体布局)
    C#报错——传递数组对象报错“未将对象引用设置到对象的实例”
    C#——保留小数点,强转
  • 原文地址:https://www.cnblogs.com/bendantuohai/p/4651932.html
Copyright © 2020-2023  润新知