这是《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
分享到:
相关推荐
在Spring AOP中,我们可以创建一个`SpeakerProxy`代理类,它实现了`ISpeaker`接口,并持有真实对象的引用。在代理类的`say()`方法中,我们可以在调用真实对象的`say()`方法前后添加`getGift()`和`giveGift()`。 ```...
这部分可能会介绍如何创建第一个Spring应用,包括引入Spring库,创建bean定义,以及如何启动和使用Spring容器。 综合来看,这份"spring_2021.7.14.zip"压缩包提供了Spring框架的初级到中级的学习资源,涵盖了从基础...
本思维导图包含了Spring的主要组成部分,对于初学者而言,它是一个了解Spring框架体系结构的绝佳工具;对于经验丰富的开发者,它则可以帮助温故知新,快速回忆起Spring的各项技术。 首先,Spring的核心组件包括...
spring cloud + openshift example
SpringCloud作为一个完整的微服务解决方案,它提供了包括服务注册与发现、配置中心、全链路监控、熔断器、负载均衡、API Gateway等一系列功能,帮助开发者快速构建复杂的分布式系统。 在描述中提到的学习资源被高度...
Spring Cloud Config 是一个用于分布式系统配置管理的框架,它允许开发者在远程服务器上集中管理和版本化应用的配置,而不是在每个应用本地存储配置。这种方式在微服务架构中尤其有用,因为多个独立的服务需要共享和...
常用的spring注解大全,适合新手学习、老手温故知新。读懂spring,平步青云。
1. 工业机器人行业概述:工业机器人是机械工程中的一种高科技自动化设备,主要应用于汽车制造、电子电器、化学橡胶塑料、金属制品、食品制造等多个行业。根据国际机器人联合会(IFR)的统计数据,2019年全球工业...
工业机器人是现代制造业中不可或缺的重要组成部分,其发展水平是衡量一个国家制造业自动化、智能化程度的重要标志。本文档探讨了工业机器人在汽车行业中的应用,并结合美国汽车行业历史上的“2mm工程”,分析了工业...
百丽作为行业龙头,凭借“多品牌+快速渠道扩张+强供应链掌控”的战略,长期位于国内女鞋市占率第一。但在2013年之后,行业进入调整期,公司渠道效率和品牌力的问题逐渐凸显,业绩逐步下滑。 本报告中,我们将探讨...
“温故知新”系列之工业机器人行业复盘(三):从零部件国产化看产业链协同发展(附报告).pdf
“温故知新”系列之工业机器人行业复盘(二):从美国汽车行业“2mm工程”看工业机器人国产化空间
初中语文文学讨论现当代文学温故知新
《中信建设温故知新,从 4G 看 5G》这份资料主要探讨了移动通信技术从第四代(4G)到第五代(5G)的演进过程,以及这一演变带来的技术创新和产业影响。4G 和 5G 作为两个重要的通信时代,它们之间的差异和联系构成了...
这篇报告是光大证券“类固收系列报告”的第四部分,旨在为机构投资者提供参与科创板新股网下配售的指导,通过科学的模型和策略提高投资收益。之前的报告分别讨论了打新收益的预期、市场热度、战略配售基金的投资价值...
中信建设温故知新,从 4G 看 5G.pdf
所谓浮点规格化,是指尾数S的绝对值小于1而大于或等于1/2,即小数点后面的第一位必须是"1"。 在计算机中,究竟采用浮点制还是定点制,必须根据使用要求设计。目前,一般小型机、微型机多采用定点制,而大型机、巨型...
在Web开发领域,Java技术是不可或缺的一部分,其中JSP(JavaServer Pages)、Servlet和Filter是三个核心概念。本文将深入探讨这些技术,帮助开发者温故知新,理解它们的功能、工作原理以及如何在实际项目中应用。 #...