Java动态代理+注解体现Spring AOP思想
2017-07-31 15:48
761 查看
在MVC的架构中,优秀的代码是Service业务层只做业务逻辑处理,如果要添加新功能(如日志,事务等),不应该污染业务层代码。
讲得很抽象,简单来说,如果我要在业务层添加日志功能,在业务层代码内不应该出现Logger这个东西。
想知道怎么实现吗?使用JAVA的动态代理技术,这里体现了Spring AOP切面编程的思想。
这像什么?就是Spring AOP切面编程。
业务场景:用户业务处理接口(UserService)内有个addUser(String name)方法,我现在需要给他加上日志输出。但是要求不能在该方法内写Logger的代码。(不污染业务代码)。
3.1 首先我们建一个自定义注解类: Log.java
3.2 建一个代理类LogProxy.java
3.3 UserService接口添加日志功能的方法上加上注解@Log
3.4 最后进行测试
输出结果为:
讲得很抽象,简单来说,如果我要在业务层添加日志功能,在业务层代码内不应该出现Logger这个东西。
想知道怎么实现吗?使用JAVA的动态代理技术,这里体现了Spring AOP切面编程的思想。
1. 什么是动态代理?
查理论能查几页纸,这里简单总结一句话:调用Proxy返回一个代理对象,使用这个代理对象执行你的方法时,它会先执行代理对象里的方法再执行你的业务方法。这像什么?就是Spring AOP切面编程。
2. 为什么要用动态代理?
业务层代码专注业务处理,添加新功能时,如日志,事务等。不污染业务代码。3. 怎么用?
这里给出一个例子:业务场景:用户业务处理接口(UserService)内有个addUser(String name)方法,我现在需要给他加上日志输出。但是要求不能在该方法内写Logger的代码。(不污染业务代码)。
3.1 首先我们建一个自定义注解类: Log.java
package annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 自定义日志注解,用于判断该方法执行前是否需要写入日志 * @author GANAB * */ @Retention(RetentionPolicy.RUNTIME) @Target(value=ElementType.METHOD) public @interface Log {}
3.2 建一个代理类LogProxy.java
package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import annotation.Log; public class LogProxy implements InvocationHandler{ //声明被代理类对象 private Object src; //在私有的构造中给成员设置值 private LogProxy(Object src){ this.src=src; } /** * 提供一个静态的方法返回代理对象 */ public static Object factory(Object src){ Object proxyedObj = //生成被代理类的接口的子类 Proxy.newProxyInstance( LogProxy.class.getClassLoader(), src.getClass().getInterfaces(), new LogProxy(src)); return proxyedObj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //如果该方法带有Log注解,先执行Logger操作再执行该方法 if(method.isAnnotationPresent(Log.class)){ System.out.println("logger..."); return method.invoke(src, args); }else{ return method.invoke(src, args); } } }
3.3 UserService接口添加日志功能的方法上加上注解@Log
public interface UserService { @Log int addUser(String name); } public class UserServiceImpl implements UserService{ @Override public int addUser(String name) { System.out.println("add user "+ name); return 1; } }
3.4 最后进行测试
public class ProxyTest { public static void main(String[] args) { //特点: 最先执行最后返回的代理对象的代理方法。如下:先执行Log最后执行业务方法。 UserService service = new UserServiceImpl(); service = (UserService)LogProxy.factory(service); service.addUser("abel"); } }
输出结果为:
logger... add user abel
4. 总结
使用动态代理可以使业务代码只专注业务逻辑处理。添加功能可以采用这种方法添加。相关文章推荐
- 【JavaWeb-14】代理Proxy、动态代理、AOP编程思想、注解、元注解、类加载器
- JAVA动态代理 和 Spring AOP 4种通知的简单实现
- 10077---Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring -AOP -java静态代理和动态代理实例
- Java利用动态代理模拟实现Spring的AOP(面向切面编程)功能的小实践
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring 4 学习笔记4:Java动态代理(Spring AOP原理)
- Spring动态代理,aop 注解实现aop
- Spring 动态代理分析&AOP的XML的方式&注解方式
- JAVA动态代理 和 Spring AOP 4种通知的简单实现
- 第37天(就业班) 静态代理与动态代理、oglib代理、手动实现aop编程、注解实现AOP编程、aop相关的几个注解、xml实现aop、切入点表达式、spring对aop模式
- java 代理模式,JDK动态代理,SpringAOP的实现
- [Spring学习笔记 4 ] AOP 概念原理以及java动态代理
- Java动态代理-->Spring AOP
- Spring的AOP动态代理通过注解注入方法
- JAVA动态代理 和 Spring AOP 4种通知的简单实现
- [Java]Spring AOP基础知识-动态代理
- SpringAOP原理之---Java动态代理
- Spring Boot AOP之Java 动态代理
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)