【Spring MVC系列】--(5)理解AOP
1、java反射
实用:JAVA反射机制及应用例子
http://407827531.iteye.com/blog/1173930
系统:java反射原理
http://china-jianchen.iteye.com/blog/728774
JAVA 反射机制是Java 被视为动态(或准动态)语言的一个关键性质。
这个机制允许程序在运行时通过Reflection APIs 取得任何一个已知名称的class 的内部资讯,
包括其modifiers(诸如public, private,static 等等)、superclass(例如Object)、interfaces(例如Cloneable)也包括fields 和methods 的所有资讯,
并在运行时调用任意一个对象的方法;生成动态代理
String str = "com.xtlh.sinye.Goods";
//取得类
Class c = Class.forName(str);
//实例化对象
Object obj = c.newInstance();//初始化一个Goods的对象
//取得方法(方法名,有类型)
Method m = c.getMethod("setId",new Class[]{Class.forName("java.lang.String")});
new Class[]{Class.forName("java.lang.String")}可以换为
String.class;//更多类型 Long.TYPE Integer.TYPE,或者使用Long.class、Integer.class
//取得方法(方法名,无类型)
m = c.getMethod("getId",new Class[]{});
//执行带参函数
m.invoke(obj,new Object[]{"it's apple"});
//执行不带参函数
m.invoke(obj,new Object []{});
//获得类中声明的方法
Method me[] = c.getDeclaredMethods();
//判断是不是此类的对象(带参构造)
boolean b1 = c.isInstance(new Integer(34));
//判断是不是此类的对象(无参构造)
boolean b2 = c.isInstance(new Goods());
//取得类所有的方法继承来的方法等
Method med1[] = c.getMethods();
//取得方法的参数类型
Class pvec[] = m.getParameterTypes();
//方法的异常
Class evec[] = m.getExceptionTypes();
//方法的返回类型
mee.getReturnType();
//获得构造函数的参数类型
Class[] consParaType = cons.getParameterTypes();
//获取类的构造函数
Constructor ctorlist[] = c.getDeclaredConstructors();
//获取类的属性
Field fieldlist[] = c.getDeclaredFields();
//获取属性名称
field.getName()
//获取属性类型
field.getType()
//获取属性的修饰符 private/public/protected
int mod = field.getModifiers();
Modifier.toString(mod)
//取得属性值
Field fld = ccc.getDeclaredField("price");
//改变属性的值
fld.setDouble(goods1, 25.0);
//使用数组
Class cla = Class.forName("java.lang.String");
Object arr = Array.newInstance(cla, 10);
Array.set(arr, 5, "hello Watermelon");
String s = (String) Array.get(arr, 5);
//复杂数组使用
int dims[] = new int[]{5, 10, 15};
Object array = Array.newInstance(Integer.TYPE, dims);
Object arrobj = Array.get(array, 3);
Class cl = arrobj.getClass().getComponentType();
System.out.println(cl);
arrobj = Array.get(arrobj, 5);
Array.setInt(arrobj, 10, 37);
int arrcast[][][] = (int[][][]) array;
System.out.println(arrcast[3][5][10]);
//创建对象,根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象,而不是在编译的时候创建对象,这一点非常有价值
Class clss = Class.forName("com.xtlh.sinye.Goods");
Class partypess[] = new Class[2];
partypess[0] = String.class;
partypess[1] = String.class;
Constructor ct = clss.getConstructor(partypess);
Object arglists[] = new Object[2];
arglists[0] = new String("hello");
arglists[1] = new String("orange");
Object retobjs = ct.newInstance(arglists);
2、代理模式
2.1、静态代理:
设计模式之代理模式
http://www.blogjava.net/yangjunwei/archive/2013/04/23/398275.html
代理模式是一种间接调用的体现
就是执行代理类的方法,在代理类的方法中调用被代理类(委托类)的方法;
两个类实现同一个接口。
可以发现
每一个代理类只能为一个接口服务,这样一来程序开发中必然会产生过多的代理,而且,所有的代理操作除了调用的方法不一样之外,其他的操作都一样,则此时肯定是
重复代码。解决这一问题最好的做法是可以通过一个代理类完成全部的代理功能,那么此时就必须使用动态代理完成。
2.2、动态代理:
java动态代理学习笔记
http://langyu.iteye.com/blog/410071
委托的对象、接口和代理类都能动态改变;
1.interface InvocationHandler
Object invoke(Object proxy, Method method, Object[] args)
代理类继承之,并实现invoke。
2.class Proxy
在最后使用代理时出场。
Class<?> getProxyClass(ClassLoader loader, Class<?>[] interface)
用来产生代理类,参数要提供interface数组,它会生成这些interface的“虚拟实现”,
用来冒充真实的对象。
Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
产生代理对象,多了InvocationHandler参数(只是InvocationHandler接口的实现类),
它与代理对象关联,当请求分发到代理对象后,会自动执行h.invoke(...)方法,
invoke方法就是我们用来做N多事情的地方 -_-。
关键是调用:
(1)委托类(B)实例
A/B b= new B();
代理类(C)实例(与委托类关联)
C c = new C(b);
(2)接口(A)对象(Proxy类实例)
//这里把C与A新生成的代理类相关联
A a= (A) Proxy.newProxyInstance(b.getClass().getClassLoader(), b.getClass().getInterfaces(), c);
(3)调用接口中方法
//这里无论访问哪个方法,都是会把请求转发到handler.invoke
a.print("All the test");
a.sayHello("Denny");
aop涉及 动态代理和反射
aop就是面向切面的编程。比如说你每做一次对数据库操作,都要生成一句日志。如果,你对数据库的操作有很多类,那你每一类中都要写关于日志的方法。但是如果你用aop,那么你可以写一个方法,在这个方法中有关于数据库操作的方法,每一次调用这个方法的时候,就加上生成日志的操作。
将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。
这里为什么代理只能代理接口,因为生成的代理类都继承自Proxy类,如果再继承其他类,跟JAVA继承(单继承)原则就有冲突
2.3、cglib实现类的代理:
java动态代理(JDK和cglib)
http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html
cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
【Spring MVC系列】--(5)理解AOP的更多相关文章
- 【Spring MVC系列】--(4)返回JSON
[Spring MVC系列]--(4)返回JSON 摘要:本文主要介绍如何在控制器中将数据生成JSON格式并返回 1.导入包 (1)spring mvc 3.0不需要任何其他配置,添加一个jackso ...
- Spring mvc系列一之 Spring mvc简单配置
Spring mvc系列一之 Spring mvc简单配置-引用 Spring MVC做为SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块 ...
- Spring MVC系列之模型绑定(SpringBoot)(七)
前言 上一节我们在SpringBoot中启用了Spring MVC最终输出了HelloWorld,本节我们来讲讲Spring MVC中的模型绑定,这个名称来源于.NET或.NET Core,不知是否恰 ...
- 我看Spring MVC系列(一)
1.Spring MVC是什么: Spring MVC:Spring框架提供了构建Web应用程序的全功能MVC模块. 2.Spring helloWorld应用(基于Spring 4.2) 1.添加S ...
- Spring MVC系列之JDBC Demo(SpringBoot)(七)
前言 前面我们了解了Spring MVC的基本使用,其实和.NET或.NET Core MVC无异,只是语法不同而已罢了,本节我们将和和数据库打交道,从最基础的JDBC讲解起,文中若有错误之处,还望指 ...
- Spring MVC系列-(5) AOP
5 AOP 5.1 什么是AOP AOP(Aspect-Oriented Programming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的 ...
- Spring MVC系列-(1) Spring概述
1. Spring概述 本章主要介绍Spring中的体系结构和常见概念,比如bean.控制反转(Inverse of Control,IoC)等. 1.1 体系结构 Spring 框架提供约 20 个 ...
- Spring MVC系列[2]——参数传递及重定向
1.目录结构 2.代码 <?xml version="1.0" encoding="UTF-8"?> <web-app version=&qu ...
- Spring MVC系列[1]—— HelloWorld
1.导入jar包 ioc mvc 复制spring-mvc.xml到src目录下. 2.web.xml <?xml version="1.0" encoding=" ...
随机推荐
- ARGB和RGB
ARGB 一种色彩模式,也就是RGB色彩模式附加上Alpha(透明度)通道,常见于32位位图的存储结构. ARGB---Alpha,Red,Green,Blue. Alpha-图像通道 如果图形卡具有 ...
- Android开发手记(10) 下拉菜单Spinner
1.自定义Spinner 首先,定义Spinner要显示的项目列表/res/values/arrays.xml <?xml version="1.0" encoding=&q ...
- java代码实现 金字塔(倒置)
在jsp中实现如图所示的金字塔,,代码如下: 大致思路如下: 1.先画出前5行.因为 i+空格数=总行数,所以第一行的空格数是 总行数-i(第几行),然后画出 *,*的数目=2*i-11: 2.在画出 ...
- Swift - 38 - 枚举的基本语法
//: Playground - noun: a place where people can play import UIKit // 创建一个枚举类型就相当于创建了一个新的数据类型, 所以首字母应 ...
- wsdl和wadl区别
[转]http://blog.csdn.net/liuxiao723846/article/details/51611183 1.Java开发WebService最重要的两个规范: JSR-224 ( ...
- Apache 2.x+jboss6.1反向代理session共享问题设置
2016年8月4日,第一次开笔写博客园,今天在公司解决了一个问题. apache+jboss做负载均衡的问题一直困扰了很久.问题描述如下,使用apche做反向代理转发给3台jboss 的app,app ...
- Android中通过Java获取Webview加载内容
有时候我们需要在加载webview时,获取加载完成的内容,当然,WebView也是有可能包含javascript.通过以下操作,我们是可以获取到WebView加载的内容. 1.自定义一个内部类,获取W ...
- wdcp/wdlinux 常用工具及命令集
强制修改Mysql的root密码,在忘记mysql密码时有用 sh /www/Wdlinux/tools/mysql_root_chg.sh ftp配置文件检查,在FTP不能连接或登录时有用sh /w ...
- php urlencode()函数URL编码转换实例解析
URLEncode:是对网页url所包含中文字符的一种编码转化方式,URLEncode有两种常见方式,一种是基于GB2312的 Encode(Baidu.Yisou等搜索引擎使用),另一种是基于UTF ...
- 【Beta】阶段汇总
[项目文档&API文档] PhyLab2.0需求与功能分析改进文档(NABCD) PhyLab2.0设计分析阶段任务大纲(α) 团队个人贡献分分配规则 功能规格说明书 [Phylab2.0]B ...