Spring进阶之路(9)-Spring AOP面向切面编程概念以及通过JDK代理生成AOP代理对象
来源:互联网 发布:淘宝客服差评处理技巧 编辑:程序博客网 时间:2024/05/18 02:56
在软件开发中,分布于应用中多处的功能被称为横切关注点,,通常情况下,这些横切关注点从概念上是与应用的业务逻辑相分离的。将这些横切关注点与我们的业务逻辑相分离是面向切面编程AOP所要解决的事情。
AOP中的名词解释
Advice(通知):定义了切面是什么,以及什么时候使用。主要包括:before、after、after-returning、after-throwing、aound(在被通知的方法调用之前和调用之后执行)。
JoinPoint(连接点):程序执行过程中明确的点,比如方法的调用,异常的抛出。可以利用这些点插入应用的正常流程之中,添加新的行为。
PointCut(切入点):其定义匹配通知所要织入的一个或多个连接点,通常用明确的类和方法名称来指定切点,或者利用正则表达式定义匹配的类和方法名称模式来指定这些切点。
Aspect(切面):切面是通知和切点的结合,通知和切点共同定义了关于切面的全部内容,包括是什么,在什么时候什么地方执行。
引入:允许我们向现有的类中添加新的方法或者是属性,
织入:将切面应用到目标对象来创建新的代理对象的过程。
通过JDK代理生成AOP代理对象
Spring中的AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理,因此,AOP代理可以直接使用容器中的其他Bean作为目标。Spring默认是由java动态代理来创建AOP代理的,下面先自己实现一下这个生成代理的过程。
package com.siti.spring20160314;public interface Person {public void saySth();}User类实现这个Person接口,并实现其方法。
package com.siti.spring20160314;public class User implements Person{private String userName;private String password;public User(){}public User(String userName, String password) {super();this.userName = userName;this.password = password;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic void saySth() {System.out.println("hello!");}}
package com.siti.spring20160314;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class MyProxy4AOPObject implements InvocationHandler{private Object targetObj;public Object getProxyObject(Object targetObj){this.targetObj = targetObj;// 第一个参数是类的加载器// 第二个参数表示接口// 第三个参数表示当前创建代理对象的过程中调用谁的拦截方法return Proxy.newProxyInstance(this.targetObj.getClass().getClassLoader(), this.targetObj.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] arg2)throws Throwable {User user = (User) this.targetObj;if(user.getUserName() != null && user.getUserName() != ""){method.invoke(targetObj, arg2);}return null;}}
测试类
package com.siti.spring20160314;public class MainTest {public static void main(String[] args) {User user = new User("", "wy");MyProxy4AOPObject myProxy4AOPObject = new MyProxy4AOPObject();Person person = (Person) myProxy4AOPObject.getProxyObject(user);person.saySth();}}
1 0
- Spring进阶之路(9)-Spring AOP面向切面编程概念以及通过JDK代理生成AOP代理对象
- Spring进阶之路(10)-Advice简介以及通过cglib生成AOP代理对象
- Spring AOP面向切面编程及两种动态代理
- spring生成代理对象的过程(AOP切面)
- Spring AOP---切面编程基础(动态代理)
- Java动态代理之JDK动态代理和CGLib动态代理 面向切面编程AOP原理
- spring框架学习之路(一)-入门基础(2)-动态代理和AOP(面向切面编程)
- Spring之AOP实现面向切面编程
- Spring之AOP,面向切面编程
- Spring之AOP面向切面编程
- Spring实践之面向切面编程(AOP)
- Spring boot之AOP面向切面编程
- Spring之AOP(面向切面编程)
- Spring框架之AOP面向切面编程
- Spring之AOP(面向切面编程)
- Spring之面向切面编程AOP(三)
- Spring-AOP @AspectJ进阶之绑定代理对象
- Spring-AOP @AspectJ进阶之绑定代理对象
- 优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案
- EJB到底是什么,真的那么神秘吗??
- PagerAdapter
- Android 中部分文字高亮显示方法
- Toolbar使用说明
- Spring进阶之路(9)-Spring AOP面向切面编程概念以及通过JDK代理生成AOP代理对象
- spark sql 1.6.0 自定义永久函数
- 可执行文件中和动态链接有关的段section
- leetcode 60. Permutation Sequence
- CodeForces 630L:Cracking the Code【数论】
- 元素的排序
- 抽象数据类型的定义
- 【BZOJ2038】小Z的袜子,第一次的莫队算法
- ElasticSearch 简单入门