Spring学习之代理
Spring的核心就是IOC和AOP
IOC就是控制反转: 就是用配置文件的方式给javabean 赋值.
正常的在程序里;用new 的方式创建一个对象的时候,他就固定了值,
如果是注入的方式的话可以根据配置文件的配置给他一个值(就变成可改的了).这个好像进一步模式化了程序代码.(个人理解)总有一天可能
一个程序完成所有的应用吧.只要我改配置文件.
AOP:面向切面编程:个人理解就是在执行方法的时候做一些事情.让业务更纯净一些,其他的一些必须的功能就切入一段代码完成.如事物.
而AOP的底层是用代理模式完成的.所以代理模式的理解有助于理解AOP
一.静态代理:
java的代理需要接口:
所以先定义一个接口:
TestInterface
package po;
public interface TestInterface {
String getConten();
}
实现类:
package po.impl;
public class TestImpl implements Student {
@Override
public String getConten() {
return "我是真实对象";
}
}
静态代理类:
package po.impl;
public class TestProxy implements TestInterface{
private TestInterface test;
public TestProxy() {
}
public TestProxy(TestInterface test) {
this.test = test;
}
@Override
public String getConten() {
System.out.println("我是增强");
System.out.println(test.getConten());
return null;
}
}
测试类:
public class MYtest {
public static void main(String[] args) {
//测试
new TestProxy(new TestImpl()).getConten();
}
}
动态代理: 那个接口和实现类不变,不用创建代理类了,java会自动创建代理类
测试类代码如下
package ui; import java.lang.reflect.Method; import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy; import po.TestImpl;
import po.TestInterface;
import po.TestInterface;
import po.TestInterface;
import po.TestProxy; public class MYtest {
public static void main(String[] args) { //测试
new TestProxy(new TestImpl()).getConten();
//测试动态代理
final TestInterface stu=new TestImpl();
TestInterface proxy = (TestInterface)Proxy.newProxyInstance(stu.getClass().getClassLoader(),stu.getClass().getInterfaces(),new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] h)
throws Throwable {
System.out.println("我是动态代理增强!!!");
return method.invoke(stu,h);
}
});
System.out.println( proxy.getConten());; }
}
其中调用了Proxy类的newInstance()方法该方法的参数有三个
1.ClassLoader :类加载器,new的时候就是这个创建的类,对象.getClass().getClassLoader()的得到改对象的类的类加载器,
2.Class[] 得到接口数组
3.InvocationHandler :句柄(我不太懂,就是一个匿名类,就是程序创建的动态代理类,我是这么理解的.)
其中这部分invoke方法就是执行的动态代理的方法,他的三个参数
1.proxy: 指代我们所代理的那个真实对象
2.method: 指代的是我们所要调用真实对象的某个方法的Method对象
3.args: 指代的是调用真实对象某个方法时接受的参数
@Override
public Object invoke(Object proxy, Method method, Object[] h)
throws Throwable {
System.out.println("我是动态代理增强!!!");
return method.invoke(stu,h);
}
Spring学习之代理的更多相关文章
- Spring学习笔记--代理
静态代理 1.静态代理的角色分析(UML画图推荐使用StarUML软件) 抽象角色---一般使用接口或者抽象类来实现. 真实角色---被代理的角色. 代理角色---代理真实角色—代理真是角色后一般会做 ...
- Spring学习13-中IOC(工厂模式)和AOP(代理模式)的详细解释
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC是工厂模式参考:设计模式- ...
- Spring学习笔记之aop动态代理(3)
Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...
- Spring学习之AOP总结帖
AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组 ...
- Spring学习之第一个AOP程序
IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对 ...
- Spring学习(三)——Spring中的依赖注入的方式
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- Spring学习笔记(二)Spring基础AOP、IOC
Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...
- 我的Spring学习记录(二)
本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...
- spring学习(三) ———— spring事务操作
前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTem ...
随机推荐
- Hadoop学习记录(4)|MapReduce原理|API操作使用
MapReduce概念 MapReduce是一种分布式计算模型,由谷歌提出,主要用于搜索领域,解决海量数据计算问题. MR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce( ...
- 查看目标文件是否是以-fPIC编译的, ar 打包命令将多个静态库打包到一个里面
readelf --relocs foo.o | egrep '(GOT|PLT|JU?MP_SLOT)' 上句大多数时候(和平台有关)可以正确判断是否是以fPIC选项编译的,如果输出为空,基本可以表 ...
- Linux的五个查找命令:find,locate,whereis,which,type
使用电脑的时候,经常需要查找文件. 在Linux中,有很多方法可以做到这一点.国外网站LinuxHaxor总结了五条命令,你可以看看自己知道几条.大多数程序员,可能经常使用其中的2到3条,对这5条命令 ...
- 8-15-Exercise
8-15-小练 这次的题目......只觉得泪奔啊......T T A.HDU 1042 N! 因为0<=n<=1000,故一定要用数组或字符串[同样因为n<=1000故用数组 ...
- linux命令之more
转自:http://www.cnblogs.com/peida/archive/2012/11/02/2750588.html more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示 ...
- Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建
1. openSUSE是一款优秀的linux. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRjYXN0Y3Bw/font/5a6L5L2T/font ...
- 关于EF中ApplyCurrentValues和ApplyOriginalValues区别
关于EF中ApplyCurrentValues和ApplyOriginalValues区别:两者都是编辑数据时使用. // // 摘要: // 将 System.D ...
- 制作一个类似苹果VFL的格式化语言来描述UIStackView
在项目中总是希望页面上各处的文字,颜色,字体大小甚至各个视图控件布局都能够在发版之后能够修改以弥补一些前期考虑不周,或者根据统计数据能够随时进行调整,当然是各个版本都能够统一变化.看到这样的要求后,第 ...
- 关于AFNetworking访问网络超时的设置
前言:有的猿会发现在设置AFNetworking访问网络超时时,直接用self.manager.requestSerializer.timeoutInterval =10.f不起作用. 解决办法:经过 ...
- radio组件
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...