`
bolide74
  • 浏览: 83453 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring温故知新(九)Spring自动代理 (系列第一部分完结篇)

阅读更多
这是《Spring温故知新》系列的第一部基础部分的最后一篇,简单的介绍一下Spring的自动代理。

我一直都用机器人打招呼这个小应用来做举例,可能大家感觉用了前一篇的CGLIB代理以后就已经是非常方便了。但是事实上如果是真正大型的企业应用来说这还远远不够方便。

不管是动态代理还是CGLIB代理,它们在使用之前都必须先给每个Action建立相应的代理bean。小应用可能还看不出区别,但是一旦Action的熟练达到几十个甚至几百上千个的时候,这个工作量就要令人崩溃了。

Spring的自动代理就是为了解决这个问题而存在的。那么我们用一个简单的例子来学习怎么样实现动态代理,看完你就会觉得非常简单。

依然先是WallE类,没有任何变化:
package com.iteye.bolide74.action;

public class WallE {
	public String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void say(String msg) {
		System.out.println("到达邻居家,对邻居说:" + msg + ",我是" + this.name);
	}

	public void clean() {
		System.out.println("开始进行垃圾回收程序");
	}
}


然后是GetGift和GiveGift类,也跟前一篇一样没有变化:
package com.iteye.bolide74.action;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class GetGift implements MethodBeforeAdvice {

	@Override
	public void before(Method arg0, Object[] arg1, Object arg2)
			throws Throwable {
		System.out.println("获取了一个礼物!");
	}
}

package com.iteye.bolide74.action;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

public class GiveGift implements AfterReturningAdvice {

	@Override
	public void afterReturning(Object arg0, Method arg1, Object[] arg2,
			Object arg3) throws Throwable {
		System.out.println("赠予了一个礼物!");
	}

}


最后就是最关键的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就代表了开启自动代理 -->
	<bean id="autoProxyCreator"
		class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
		
	<bean id="wallE" class="com.iteye.bolide74.action.WallE">
		<property name="name" value="Wall-E" />
	</bean>
	<bean id="getGift" class="com.iteye.bolide74.action.GetGift" />
	<bean id="giveGift" class="com.iteye.bolide74.action.GiveGift" />
	
	<!-- 这里还是老样子,配置两个Advisor -->
	<bean id="getGiftAdvisor"
		class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
		<property name="advice">
			<ref bean="getGift" />
		</property>
		<property name="patterns">
			<list>
				<value>.*say.*</value>
			</list>
		</property>
	</bean>
	<bean id="giveGiftAdvisor"
		class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
		<property name="advice">
			<ref bean="giveGift" />
		</property>
		<property name="patterns">
			<list>
				<value>.*say.*</value>
			</list>
		</property>		
	</bean>
	<!-- 大家可以注意到,原先实现ProxyFactoryBean的代理bean已经没有了,只需要以上的Adivsor就可以 -->
</beans>


应用代码:
package com.iteye.bolide74.tester;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.iteye.bolide74.action.WallE;

public class GiftBySpringTester {
	public static void main(String[] args) {
		ApplicationContext actx = new ClassPathXmlApplicationContext(
				"config.xml");
		//注意:这里的getBean是wallE这个bean了,因为已经没有了代理bean
		WallE wallE = (WallE) actx.getBean("wallE");
		wallE.say("你好,Spring自动代理向你问候");
		System.out.println();
		wallE.clean();
	}
}



运行结果:
引用
获取了一个礼物!
到达邻居家,对邻居说:你好,Spring自动代理向你问候,我是Wall-E
赠予了一个礼物!

开始进行垃圾回收程序




大家可以看到这就是最终使用了CGLIB代理和自动代理的机器人打招呼送礼物应用,我们可以对比一下最前面没有使用Spring框架时的代码,我们会发现除了在应用代码中可以看到Spring的痕迹以外,几乎都和平时写的普通代码没区别,这就是Spring的一大特点,低耦合!


那么这一系列的第一部分,Spring基础知识已经基本上介绍完毕了,接下来我将会开始介绍Spring用的最多的实战部分:Spring MVC;最后我们会以Struts+Spring+Hibernate实现一个web功能来结束《Spring温故知新》系列。




上一篇:Spring温故知新(八)静态切入点和CGLIB代理,更智能、更方便!http://bolide74.iteye.com/blog/1048078
3
4
分享到:
评论
3 楼 xvshell 2017-03-16  
写的通俗易懂
2 楼 雅礼彭培 2016-01-13  
写的好,理解了
1 楼 jxb_happy 2011-07-05  
期待您的第二部分!

相关推荐

Global site tag (gtag.js) - Google Analytics