Spring实现代理机制

上一笔记,介绍了代理机制,这一节介绍Spring是如何实现代理。

通过一个例子来说明。

包下载地址(两个都要下):

http://www.blogjava.net/Files/ducklyl/springaop.rar

http://www.blogjava.net/Files/ducklyl/Spring.rar

(1)创建LogBeforeAdvice类(实现MethodBeforeAdvice接口,会在目标对象的方法执行之前被中呼叫)package com.proxy;
import java.lang.reflect.*;
import java.util.logging.Logger;
import java.util.logging.Level;
import org.springframework.aop.MethodBeforeAdvice;;
public class LogBeforeAdvice implements MethodBeforeAdvice{
private Logger logger=Logger.getLogger(this.getClass().getName());
public void before(Method method,Object[] args,Object target) throws Throwable
{
logger.log(Level.INFO,"mehtod starts "+method);
}
}

(2)创建配置文件advice-config.xml<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="logBeforeAdvice" class="com.proxy.LogBeforeAdvice" />
<bean id="helloSpeaker" class="com.proxy.HelloSpeaker" />
<bean id="helloProxy"
class="org.springframework.aop.framework.ProxyFactoryBean"><!--建立代理对象-->
<property name="proxyInterfaces"><!--代理接口-->
<value>com.proxy.IHello</value>
</property>
<property name="target"><!--代理目标-->
<ref bean="helloSpeaker" />
</property>
<property name="interceptorNames"><!--代理实现类-->
<list>
<value>logBeforeAdvice</value>
</list>
</property>
</bean>
</beans>
(3)测试类SpringAOPDemo
package com.proxy;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class SpringAOPDemo {
public static void main(String[] args)
{
//读取配置文件
 ApplicationContext context=new FileSystemXmlApplicationContext("advice-config.xml");
IHello helloProxy=(IHello)context.getBean("helloProxy");
helloProxy.hello("ducklyl");
}
}

运行测试类,结果如下:

Hello,ducklyl

时间: 2024-10-03 06:15:15

Spring实现代理机制的相关文章

Spring自动代理机制

我们一直使用ProxyFactoryBean来显式的创建AOP代理.但是在很多场合,这 种方式将会使编写配置文件的工作量大大增加:由于要从ProxyFactoryBean获得 代理对象,也会使应用和Spring之间的耦合度增加.下面介绍使用Spring提供的 自动代理机制来解决这类问题. 1.使用BeanNameAutoProxyCreator Spring提供的BeanNameAutoProxyCreator类允许我们通过Bean的name属性来 指定代理的Bean.它暴露了java.lang

spring的运行机制或者运行原理

问题描述 最近碰到的这个问题,在网上搜了下,基本上的答案要么是说的SpringMVC的,要么说的是IOC跟AOP的概要,有没有准确一点的答案,望大神指点一二 解决方案 内部最核心的就是IOC了, 动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射 反射其实就是在运行时动态的去创建.调用对象,Spring就是在运行时,跟xml Spring的配置 文件来动态的创建对象,和调用对象里的方法的 . Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类

java Proxy(代理机制)

我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾. 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我

Java动态代理机制分析及扩展,第2部分

本文希望将 Java 动态代理机制从接口扩展到类,使得类能够享有与接口类 似的动态代理支持. 设计及特点 新扩展的类名为 ProxyEx,将直接继承于 java.lang.reflect.Proxy,也声 明了与原 Proxy 类中同名的 public 静态方法,目的是保持与原代理机制在使 用方法上的完全一致. 图 1. ProxyEx 类继承图 与原代理机制最大的区别在于,动态生成的代理类将不再从 Proxy 类继承, 改而继承需被代理的类.由于 Java 的单继承原则,扩展代理机制所支持的类

Java动态代理机制分析及扩展,第1部分

引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要 简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所 有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可 以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架.通过阅 读本文,读者将会对 Java 动态代理机制有更加深入的理解.本文首先从 Java 动态代理的运行机制和特点出发,对其代码进行了分析,推演了动态生成类的内 部实现. 代理:设计模式 代理是一种常用的设

Java 动态代理机制分析及扩展

简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟推演了动态代理类的可能实现,向读者阐述了一个完整的 Java 动态代理运作过程,希望能帮助读者加深对 Java 动态代理的理解和应用. 引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的

深入理解JDK动态代理机制

一.现实生活中的代理?         在现实生活中,我们常见的有服务器代理商.联想PC代理商.百事可乐.火车票.机票等代理商,为什么会有这些个代理商呢?设想以买火车票为场景,如果我要买一张从广州去长沙的火车票,就必须去火车站排队购票,如果排队的人比较多的话,非常的耽误时间.但有了火车票代理商之后,我就可以直接去找个离我最近的代理商买票,因为这样的代理商不止一个二个,遍布全市各地. 所以代理商的出现不但减轻了火车站售票员的工作压力,同时也为市民购票提供了许多方便.只是代理商会收5块的手续费.从这

Java代理机制

1 引言 我们书写执行一个功能的函数时,经常需要在其中写入与功能不是直接相关但很有必要的代 码,如日志记录,信息发送,安全和事务支持等,这些枝节性代码虽然是必要的,但它会带 来以下麻烦: 枝节性代码游离在功能性代码之外,它下是函数的目的,这是对OO是一种破坏 枝节性代码会造成功能性代码对其它类的依赖,加深类之间的耦合,而这是OO系统所竭 力避免的 枝节性代码带来的耦合度会造成功能性代码移植困难,可重用性降低 从法理上说,枝节性代码应该`监视'着功能性代码,然后采取行动,而不是功能性代码 `通知'

关于Spring中代理类的问题

问题描述 有个现象很奇怪,我在Spring中配置业务Bean发现,在配置"TransactionProxyFactoryBean"时并不需要我指定具体业务Bean的接口是什么.而配置"ProxyFactoryBean"却需要明确配置,业务Bean所实现的接口,这是为什么?按理说既然"TransactionProxyFactoryBean"可以实现自动匹配,为什么"ProxyFactoryBean"不这样做呢? 解决方案 解决方