Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
@使用Spring AOP实例化两次控制器类_Spring_Spring Mvc_Spring Aop_Cglib_Jamon - Fatal编程技术网

@使用Spring AOP实例化两次控制器类

@使用Spring AOP实例化两次控制器类,spring,spring-mvc,spring-aop,cglib,jamon,Spring,Spring Mvc,Spring Aop,Cglib,Jamon,我正试图使用SpringAOP来评测我的控制器,但一旦我在servlet上下文xml中启用monitoringAdvisor,我的@Controller类构造函数就会被调用两次,调用堆栈如下 我假设它与CGLIB代理有关,CGLIB代理派生自@Controller注释类(本例中为PersonController) 但是如果是这样的话,那么这不是违背了Spring的单例概念(假设我试图在单例中获取一个系统范围的资源)。 请告诉我如何在使用CGLIB代理时避免此问题 我没有在web.xml中使用任何

我正试图使用SpringAOP来评测我的控制器,但一旦我在servlet上下文xml中启用monitoringAdvisor,我的@Controller类构造函数就会被调用两次,调用堆栈如下

我假设它与CGLIB代理有关,CGLIB代理派生自@Controller注释类(本例中为PersonController)

但是如果是这样的话,那么这不是违背了Spring的单例概念(假设我试图在单例中获取一个系统范围的资源)。 请告诉我如何在使用CGLIB代理时避免此问题

我没有在web.xml中使用任何ContextLoaderListener

my-servlet.xml

<bean id="monitoringInterceptor" class="org.javasimon.spring.MonitoringInterceptor" />
<bean id="monitoringAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
    <property name="advice" ref="monitoringInterceptor" />
    <property name="pointcut">
        <bean class="org.javasimon.spring.MonitoredMeasuringPointcut" />
    </property>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
</bean>
<context:component-scan base-package="org.mypackage" />
当org.mypackage.PersonController(用@Controller注释的类)构造函数第一次命中时调用堆栈

PersonController.<init>() line: 48  
NativeConstructorAccessorImpl.newInstance0(Constructor, Object[]) line: not available [native method]   
NativeConstructorAccessorImpl.newInstance(Object[]) line: 57    
DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 45    
Constructor<T>.newInstance(Object...) line: 526 
BeanUtils.instantiateClass(Constructor<T>, Object...) line: 148 
CglibSubclassingInstantiationStrategy(SimpleInstantiationStrategy).instantiate(RootBeanDefinition, String, BeanFactory) line: 87    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).instantiateBean(String, RootBeanDefinition) line: 1000   
PersonController.()行:48
NativeConstructorAccessorImpl.newInstance0(构造函数,对象[])行:不可用[本机方法]
NativeConstructorAccessorImpl.newInstance(对象[])行:57
DelegatingConstructorAccessorImpl.newInstance(对象[])行:45
构造函数.newInstance(对象…)行:526
实例化类(构造函数,对象…)行:148
CGLIBSublicsingInstallationStrategy(SimpleInstallationStrategy)。实例化(RootBeanDefinition,String,BeanFactory)行:87
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory)。实例化Bean(String,RootBeanDefinition)行:1000
当断点第二次命中时调用堆栈

PersonController$$EnhancerByCGLIB$$4ad0c197(PersonController).<init>() line: 48 
PersonController$$EnhancerByCGLIB$$4ad0c197.<init>() line: not available    
NativeConstructorAccessorImpl.newInstance0(Constructor, Object[]) line: not available [native method]   
NativeConstructorAccessorImpl.newInstance(Object[]) line: 57    
DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 45    
Constructor<T>.newInstance(Object...) line: 526 
ReflectUtils.newInstance(Constructor, Object[]) line: 228   
ReflectUtils.newInstance(Class, Class[], Object[]) line: 220    
ReflectUtils.newInstance(Class) line: 216   
Enhancer.createUsingReflection(Class) line: 643 
Enhancer.firstInstance(Class) line: 538 
Enhancer(AbstractClassGenerator).create(Object) line: 225   
Enhancer.createHelper() line: 377   
Enhancer.create() line: 285 
CglibAopProxy.getProxy(ClassLoader) line: 205   
PersonController$$enhancerbyglib$$4ad0c197(PersonController)。()行:48
PersonController$$EnhancerByGlib$$4ad0c197。()行:不可用
NativeConstructorAccessorImpl.newInstance0(构造函数,对象[])行:不可用[本机方法]
NativeConstructorAccessorImpl.newInstance(对象[])行:57
DelegatingConstructorAccessorImpl.newInstance(对象[])行:45
构造函数.newInstance(对象…)行:526
newInstance(构造函数,对象[])行:228
newInstance(类,类[],对象[])行:220
reflectils.newInstance(类)行:216
增强器.createUsingReflection(类)行:643
增强器。第一个实例(类)行:538
增强器(AbstractClassGenerator).创建(对象)行:225
Enhancer.createHelper()行:377
Enhancer.create()行:285
CglibAopProxy.getProxy(类加载器)行:205
在中找到了答案 以下段落

“与子类化和实例化子类bean不同,Spring首先创建原始bean,然后创建一个子类,将原始bean(某种程度上是装饰模式)封装在一个后处理器中”

这就是为什么构造函数会被调用两次,但实际上只有一个bean。我尝试了@PostConstruct,但只打了一次电话,这澄清了我所有的疑问。所以本质上只有一个bean。另一个只是一个代理。

在 以下段落

“与子类化和实例化子类bean不同,Spring首先创建原始bean,然后创建一个子类,将原始bean(某种程度上是装饰模式)封装在一个后处理器中”

这就是为什么构造函数会被调用两次,但实际上只有一个bean。我尝试了@PostConstruct,但只打了一次电话,这澄清了我所有的疑问。所以本质上只有一个bean。另一个只是一个代理

PersonController$$EnhancerByCGLIB$$4ad0c197(PersonController).<init>() line: 48 
PersonController$$EnhancerByCGLIB$$4ad0c197.<init>() line: not available    
NativeConstructorAccessorImpl.newInstance0(Constructor, Object[]) line: not available [native method]   
NativeConstructorAccessorImpl.newInstance(Object[]) line: 57    
DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 45    
Constructor<T>.newInstance(Object...) line: 526 
ReflectUtils.newInstance(Constructor, Object[]) line: 228   
ReflectUtils.newInstance(Class, Class[], Object[]) line: 220    
ReflectUtils.newInstance(Class) line: 216   
Enhancer.createUsingReflection(Class) line: 643 
Enhancer.firstInstance(Class) line: 538 
Enhancer(AbstractClassGenerator).create(Object) line: 225   
Enhancer.createHelper() line: 377   
Enhancer.create() line: 285 
CglibAopProxy.getProxy(ClassLoader) line: 205