Spring4 AOP配置,在不同的XML里,不产生作用,为什么?

l932 2016-03-10 02:25:27
先介绍一下背景,我接手的是一个SpringMVC+Spring(4.1.7)+MyBatis(3.3.0)的项目。
原来配置这一套的程序员,搞了两个xml:spring-context.xml和spring-mvc.xml。
【我扩展了一个xml,在spring-context.xml中使用<import/>导入——这一段代码跟本次问题没有关系。】
在web.xml中是这么配置的(关键代码):
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
......
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
后来,我需要添加一个功能,需要用到AOP,准备采用注解的方法来搞,看网上的教程,第一步都是要在xml里配置:
<aop:aspectj-autoproxy/>
有的还要求配置成:
<aop:aspectj-autoproxy proxy-target-class="true"/>
这里面主要是告诉Spring使用CGLIB还是JDK动态代理,CGLIB代理是不能面向接口编程的,设置为true就是用CGLIB。
所以我在使用AOP的时候直接用了<aop:aspectj-autoproxy/>

不好意思上面啰嗦了半天,下面进入正题:
之前的程序员在xml里面是配置了<aop:aspectj-autoproxy/>的,是配置在spring-mvc.xml里,我在开发的时候,只是瞄了一眼,看xml里有这个配置我就没有在意了,开始开发AOP的相关程序,但是无论我怎么做,写的AOP都不起作用,最后我忘了是看哪个教程了,把<aop:aspectj-autoproxy/>这段配置从spring-mvc.xml挪到了spring-context.xml里,AOP的程序立马起作用了!

我的问题就是:
<aop:aspectj-autoproxy/>这段配置为什么在spring-mvc.xml里不起作用,在spring-context.xml里就起作用?
...全文
706 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
聆听叶子 2020-04-13
  • 打赏
  • 举报
回复
引用 13 楼 l932 的回复:
这个就应该是context隔离配置的意思,很多在spring 下的一些框架组件,如feign、shiro,都有一些组件范围内的上下文child,在spring的上下文是parant,继承关系,child可以访问parent,parant不能访问child
l932 2016-03-18
  • 打赏
  • 举报
回复
l932 2016-03-18
  • 打赏
  • 举报
回复
引用 10 楼 XiaoXIANGZI222 的回复:
说下个人看法,因为Springmvc和Spring的配置文件在web.xml文件中配置方式都不一样,一个是DispatcherServlet,一个是contextConfigLocation。可能这个配置只能在Spring的配置文件中才能被识别,才有用。不太确定



你的应该是对的,我查了一下DispatcherServlet ContextLoaderListener,找到这个http://www.educity.cn/wenda/356953.html,里面说的很清楚


引用
ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,不管是使用什么表现层技术,一般如DAO层、Service层Bean;

DispatcherServlet初始化的上下文加载的Bean是只对Spring Web MVC有效的Bean,如Controller、HandlerMapping、HandlerAdapter等等,该初始化上下文应该只加载Web相关组件。


有张图我传不上来,,,,
MamyA 2016-03-18
  • 打赏
  • 举报
回复
这个问题很简单,其实如果楼主理解spring平台就不会被这个问题疑惑了。spring既是可以单独使用的各个框架,如spring security,spring framework,spring mvc等等,同样,它也是可以整合使用的一个整体的spring平台,认识这点对你这个问题基本就已经能解释了。当你分开使用各个框架并且整合到一起的时候,就是多个spring容器的生成过程,虽然最终公用容器,但是你要知道的是spring的容器范围已经发生了变化,这个时候不同框架下的spring范围内的不同配置,效果当然是不同的,这个你可以测试下,简单用一个事务范围就能测试出来的。 如果你将所有使用spring框架的部分都整合到一个容器范围中,这个时候无论哪个配置都是效果一样的。 这就是为什么你发现用spring-mvc和spring framework中配置去配置AOP会不同效果的原因。另外大家需要弄清楚的是,其实springmvc和spring framewok真的不是一个东西,而是两个东西,或者说是一个东西的两个部分。
  • 打赏
  • 举报
回复
说下个人看法,因为Springmvc和Spring的配置文件在web.xml文件中配置方式都不一样,一个是DispatcherServlet,一个是contextConfigLocation。可能这个配置只能在Spring的配置文件中才能被识别,才有用。不太确定
eahaha 2016-03-16
  • 打赏
  • 举报
回复
我现在用 的框架是在<context-param>中,但是在在网上看到一个列子是配在<servlet>中了。 http://www.dsjkf.cn/archives/328.html 是不是aop的作用不一样,位置也不一样啊?
l932 2016-03-16
  • 打赏
  • 举报
回复
引用 6 楼 eahaha 的回复:
<servlet>标签加载的是mvc框架,<context-pram>加载的是spring组件,aop是一个sping组件,所以要在<context-pram>中加载。 不知道对不对,楼主如果知道了,回复一下。
我FQ用谷歌查了一下,老外有个人也遇到这个问题了,但让我懵逼的是,他的情况跟我相反!! 我是放在<context-pram>对应的xml起作用,放在<servlet>对应的xml不起作用,而这哥们
引用 老外的问题:
I'm trying to wire up my aspect using the following declaration: <aop:aspectj-autoproxy /> When I place <aop:aspectj-autoproxy /> in my application context, the pointcut/aspect is not getting triggered. However, if I place <aop:aspectj-autoproxy /> in my servlet configuration, all is well and everything works.
这是别人对此问题的回复:
引用 老外的回复:
The servlet context param is intended to be read by a ContextLoaderListener (if that is defined in your web.xml), not by the FrameworkServlet (or its derivatives, like DispatcherServlet). The ContextLoaderListener would create a root application context (parent of all the servlet application contexts) from the config locations specified as servlet context parameter. If the servlets would read that too, the same beans would be re-defined within the servlet application context instead of just inheriting them from the parent app-ctx.
l932 2016-03-16
  • 打赏
  • 举报
回复
引用:那老外的web.xml配置,请注意他的注释
<servlet>
    <servlet-name>XYZ</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
         <!-- Aspect works when config line is in this file -->
        <param-value>/WEB-INF/classes/xyz-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<context-param>
    <param-name>contextConfigLocation</param-name>
        <!-- Aspect DOES NOT work when config line is in one of the files below -->
    <param-value>/WEB-INF/classes/xyz-application-context.xml, /WEB-INF/classes/xyz-aspectConfig.xml</param-value>
</context-param>
以上~~
eahaha 2016-03-16
  • 打赏
  • 举报
回复
<servlet>标签加载的是mvc框架,<context-pram>加载的是spring组件,aop是一个sping组件,所以要在<context-pram>中加载。 不知道对不对,楼主如果知道了,回复一下。
eahaha 2016-03-16
  • 打赏
  • 举报
回复
我个人理解是,aop,还有自动装配之类的应该在项目加载时就初始化,所以应该在<context-param>中,不知道对不对。如果楼主知道正解的话,麻烦回一下,我在这里也不确定。
l932 2016-03-15
  • 打赏
  • 举报
回复
引用 3 楼 fjd210816 的回复:
个人理解 spring-context.xml 是spring容器的配置文件,里面管控很多,而<aop:aspectj-autoproxy/>一般都是用来处理事务的,事务针对的基本都是service层(增、删、改),所以才会用到 至于spring-mvc.xml 一般都是用在controller层 用来控制视图层的 牵涉不到service所以不需要增加
我把<aop:aspectj-autoproxy/>这个放在了我扩展的一个xml里(就是在spring-context.xml中使用<import/>导入的那个xml),AOP程序也是可以启动的,但就是放在mvc那个xml不行,所以我怀疑和放在哪个文件没有关系,关键是web.xml里对context和mvc的配置,导致了,<aop:aspectj-autoproxy/>这段话在mvc的xml里不起作用,但就是不知道为什么这样。。。。
l932 2016-03-14
  • 打赏
  • 举报
回复
顶上去,不能沉啊!!
约定终点 2016-03-14
  • 打赏
  • 举报
回复
个人理解 spring-context.xml 是spring容器的配置文件,里面管控很多,而<aop:aspectj-autoproxy/>一般都是用来处理事务的,事务针对的基本都是service层(增、删、改),所以才会用到 至于spring-mvc.xml 一般都是用在controller层 用来控制视图层的 牵涉不到service所以不需要增加
l932 2016-03-11
  • 打赏
  • 举报
回复
有人吗?帮帮忙啊~~

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧