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