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学习之代理的更多相关文章

  1. Spring学习笔记--代理

    静态代理 1.静态代理的角色分析(UML画图推荐使用StarUML软件) 抽象角色---一般使用接口或者抽象类来实现. 真实角色---被代理的角色. 代理角色---代理真实角色—代理真是角色后一般会做 ...

  2. Spring学习13-中IOC(工厂模式)和AOP(代理模式)的详细解释

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC是工厂模式参考:设计模式- ...

  3. Spring学习笔记之aop动态代理(3)

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  4. Spring学习之AOP总结帖

    AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组 ...

  5. Spring学习之第一个AOP程序

    IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对 ...

  6. Spring学习(三)——Spring中的依赖注入的方式

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  7. Spring学习笔记(二)Spring基础AOP、IOC

    Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...

  8. 我的Spring学习记录(二)

    本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...

  9. spring学习(三) ———— spring事务操作

    前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTem ...

随机推荐

  1. 如何通过Visual Studio发布Azure应用程序

    发布 Azure 云服务 使用 Azure Tools for Visual Studio,可以直接从 Visual Studio 将云服务发布到 Azure. 在发布 Azure 云服务之前,必须已 ...

  2. 小波变换和motion信号处理(一)(转)

    写的太好,不得不转:http://www.kunli.info/2011/02/15/fourier-wavelet-motion-signal-1/ 这是<小波变换和motion信号处理> ...

  3. Java空字符串与null的区别和判断字符串是否为空的方法

    Java空字符串与null的区别: 1.类型null表示的是一个对象的值,而并不是一个字符串.例如声明一个对象的引用,String a = null ;""表示的是一个空字符串,也 ...

  4. 页面接口防刷 解决思路一nginx

    线上环境 很多接口 如果不做缓存 可能导致有人拿到url  每秒几万次的访问后台程序,导致系统down机. 此处, nginx可以加一层缓存. expires起到控制页面缓存的作用,合理的配置expi ...

  5. XML模式:Dublin Core

    Dublin Core 标准是一种信息分类方法,常用于图书馆.Dublin Core 标准有一个 XML Schema 定义了如何使用 XML 描述这类信息.Dublin Core 可以有效地对各种信 ...

  6. localtunnel.me 原理流程浅析

      本文採用知识共享署名-同样方式共享 4.0 国际许可协议进行许可. 近期公司的项目须要一个后台server,要求能将内网的WEBserver暴露在外网上.于是.就在网上到处搜开源项目.找到两个口碑 ...

  7. ApkTool动态打包

    引言: APK在推广的时候可能会须要动态打包APK.比方公布到不同渠道的时候,须要在manifest文件里改动渠道信息.或者app在推广的时候.须要在apk包里面加上推广人信息等. 环境变量: 1.J ...

  8. Installing the PHP/MongoDB extension on Mac OSX 10.8

    Installing PHP/MongoDB extension is a two steps task on OSX: Install the autoconf tool required for ...

  9. java19 先开服务器,再开客户端

    先开服务器,再开客户端. import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOExcep ...

  10. Top 10 questions about Java Collections--reference

    reference from:http://www.programcreek.com/2013/09/top-10-questions-for-java-collections/ The follow ...