关于Spring框架的一个问题

我想在spring中的ApuKwikEMart类的buySquishee方法植入一个前置通知,我在spring的配置文件中写道(其中KwikEMart是ApuKwikEMart的接口):<!-- 创建代理目标对象 --><bean id="kwikEMartTarget"class="com.manzhizhen.daoImpl.ApuKwikEMart"></bean><!-- 创建通知 --><bean id="welcomeAdvice" class="com.manzhizhen.daoImpl.WelcomeAdvice"></bean><!-- 代理对象 --><bean id="kwikEMart"class="org.springframework.aop.framework.ProxyFactoryBean"><property name="proxyInterfaces"><!-- 代理目标对象接口 --><value>com.manzhizhen.dao.KwikEMart</value></property><property name="interceptorNames"><!-- 要织入的通知 --><list><value>welcomeAdvice</value></list></property><property name="target"> <!-- 代理目标对象 --><ref bean="kwikEMartTarget"/></property> </bean>WelcomeAdvice类为要植入的通知public class WelcomeAdvice implements MethodBeforeAdvice{public void before(Method method, Object[] args, Object target)throws Throwable {Customer customer = (Customer) args[0];System.out.println("Hello " + customer.getName() + ".How are you doing?"); }}我在测试的java中写道:public class test {static void test1() throws Exception{ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");KwikEMart k = (KwikEMart) ctx.getBean("kwikEMartTarget");k.buySquishee(new Customer());}public static void main(String[] args) throws Exception {test1();System.out.println("over");}}好像前置通知没有成功,WelcomeAdvice的before没运行,请问大侠是为什么呢?配置错了你教我怎么改啊! 这问题应该不难吧?有谁帮帮我啊!
2026年09月26日 19:13
有2个网友回答
网友(1):

Spring框架的好处
在我们进入细节以前,让我们看一下Spring可以给一个工程带来的一些好处:
◆Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有APIs的framework,你会发现Spring关注了遗留下的问题,。
◆Spring能消除在许多工程上对Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。
◆Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。
◆Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
◆Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
◆使用Spring构建的应用程序易于单元测试。
◆Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
◆Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。
■Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
总结起来,Spring有如下优点:
◆低侵入式设计,代码污染极低
◆ 独立于各种应用服务器,可以真正实现Write Once,Run Anywhere的承诺
◆Spring的DI机制降低了业务对象替换的复杂性
◆Spring并不完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
Spring能做什么?
Spring提供许多功能,在此我将快速地依次展示其各个主要方面。
首先,让我们明确Spring范围。尽管Spring覆盖了许多方面,但我们已经有清楚的概念,它什么应该涉及和什么不应该涉及。
Spring的主要目的是使J2EE易用和促进好编程习惯。
Spring不重新开发已有的东西。因此,在Spring中你将发现没有日志记录的包,没有连接池,没有分布事务调度。这些均有开源项目提供(例如Commons Logging 用来做所有的日志输出,或Commons DBCP用来作数据连接池),或由你的应用程序服务器提供。因为同样的的原因,我们没有提供O/R mapping层,对此,已有有好的解决办法如Hibernate和JDO。
Spring的目标是使已存在的技术更加易用。
例如,尽管我们没有底层事务协调处理,但我们提供了一个抽象层覆盖了JTA或任何其他的事务策略。
Spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西。例如,象许多开发人员,我们从来没有为Struts高兴过,并且感到在MVC web framework中还有改进的余地。在某些领域,例如轻量级的IoC容器和AOP框架,Spring有直接的竞争,但是在这些领域还没有已经较为流行的解决方案。(Spring在这些区域是开路先锋。)

Struts的流程
服务器启动后,根据web.xml加载ActionServlet读取struts-config.xml文件内容到内存。
以登陆为例:第一次进login.jsp会先实例化Form、把默认值赋给表单元素。
输入用户名密码提交表单、提交到action属性的login.do,通过ActionServlet读struts-config.xml文件找到 action下的path属性找到.do,通过name属性找form-beans中的form-bean的name属性得到ActionForm的包名类名,先实例化form,把表单的值填充给form,调用form的validate方法验证、ActionErrors返回null表示验证通过,否则失败返回input指定的页面.验证通过会实例化Action,执行Action的excute方法。
Struts框架结构图
相应框架结构如图:
Struts对Model,View和Controller都提供了对应的组件。
在上图中,ActionServlet,这个类是Struts的核心控制器,负责拦截来自用户的请求。
Action,这个类通常有用户提供,该控制器负责接收来自ActionServlet的请求,并根据该请求调用模型的业务逻辑方法处理请求,并将处理结果返回给JSP页面显示。

Model部分

由ActionForm和JavaBean组成,其中ActionForm用于封装用户的请求参数,封装成ActionForm对象,该对象被ActionServlet转发给Action,Action根据ActionFrom里面的请求参数处理用户的请求。
JavaBean则封装了底层的业务逻辑,包括数据库访问等。

View部分

该部分采用JSP实现。
Struts提供了丰富的标签库,通过标签库可以减少脚本的使用,自定义的标签库可以实现与Model的有效交互,并增加了现实功能。对应上图的JSP部分。

Controller组件

Controller组件有两个部分组成——系统核心控制器,业务逻辑控制器。
系统核心控制器,对应上图的ActionServlet。该控制器由Struts框架提供,继承HttpServlet类,因此可以配置成标注的Servlet。该控制器负责拦截所有的HTTP请求,然后根据用户请求决定是否要转给业务逻辑控制器。
业务逻辑控制器,负责处理用户请求,本身不具备处理能力,而是调用Model来完成处理。对应Action部分。
Struts框架
struts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发。
本章详细讨论struts架构。我们将看到struts是如何清晰地区分控制,事务逻辑和外观,从而简化了开发应用程序过程的。我们还将介绍struts提供的类如何使得开发工作更加简单,这些类包括:
 控制程序流程的类
 实现和执行程序事务逻辑的类
 自定义的标记库使得创建和验证HTML表单更加容易

如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!

vaela

网友(2):

配置错了 - -!