Java – spring @ transactional annotation cannot use automatic wiring?
My application uses spring auto wiring to configure beans I just tried to add @ transactional, and it seems that I didn't call the expected proxy I want the personalcontroller to call updatepoublicmaservice using the updatepoublicmaservice wrapped by the transaction agent
What I see is that personalcontroller is instantiated twice It obtains the proxy for the first time, but obtains the target without proxy for the second time What on earth did I do wrong?
Thank you very much for your help
web. In XML
... <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/applicationContext-security.xml</param-value> </context-param> ...
applicationContext. In XML
... <tx:annotation-driven transaction-manager="txManager"/> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> ...
ApplicationContext security XML file
... <context:component-scan base-package="com.th"/> <context:component-scan base-package="org.springframework.security.core.userdetails"/> ...
PersonalController
@Controller @RequestMapping("/personal") public class PersonalController { @Autowired public void setUpdatePublicMapService(UpdatePublicMapService updatePublicMapService) { this.updatePublicMapService = updatePublicMapService; } }
UpdatePublicMapService
@Service @Transactional public class UpdatePublicMapService { ... }
Recording fragment
13:14:40,268 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Creating shared instance of singleton bean 'personalController' 13:14:40,268 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Creating instance of bean 'personalController' ... 13:14:40,293 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Found injected element on class [com.th.rest.personal.trailsegment.PersonalController]: AutowiredMethodElement for public void com.th.rest.personal.trailsegment.PersonalController.setUpdatePublicMapService(com.th.service.UpdatePublicMapService) 13:14:40,325 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Processing injected method of bean 'personalController': AutowiredMethodElement for public void com.th.rest.personal.trailsegment.PersonalController.setUpdatePublicMapService(com.th.service.UpdatePublicMapService) 13:14:40,326 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Creating shared instance of singleton bean 'updatePublicMapService' 13:14:40,326 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Creating instance of bean 'updatePublicMapService' 13:14:40,380 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Found injected element on class [com.th.service.UpdatePublicMapService]: AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPersonalRouteDataGateway(com.th.data.personal.PersonalRouteDataGateway) ... 13:14:40,420 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'updatePublicMapService' to bean named 'publicTrailJunctionDataGatewayImpl' 13:14:40,420 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor' 13:14:40,430 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [updateToPublicMap] with attribute [PROPAGATION_required,ISOLATION_DEFAULT] 13:14:40,459 DEBUG [org.springframework.aop.framework.autoproxy.InfrastructureAdvisorAutoProxyCreator] - Creating implicit proxy for bean 'updatePublicMapService' with 0 common interceptors and 1 specific interceptors 13:14:40,500 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Creating cglib2 proxy: target source is SingletonTargetSource for target object [com.th.service.UpdatePublicMapService@6abe6abe] 13:14:40,849 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Returning cached instance of singleton bean 'org.springframework.transaction.interceptor.TransactionInterceptor#0' 13:14:40,877 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public void com.th.service.UpdatePublicMapService.updateToPublicMap(long) 13:14:40,878 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: java.util.Map com.th.service.UpdatePublicMapService.copySegments(com.th.data.personal.PersonalRoute,java.util.Map) 13:14:40,878 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: java.util.Map com.th.service.UpdatePublicMapService.makePrivateTrailsPublic(com.th.data.personal.PersonalRoute) 13:14:40,878 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [copyTrailJunctions] with attribute [PROPAGATION_required,879 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public void com.th.service.UpdatePublicMapService.copyTrailJunctions(com.th.data.personal.PersonalRoute) 13:14:40,880 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [junctionHasSegmentToUpdatePublicMap] with attribute [PROPAGATION_required,880 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public boolean com.th.service.UpdatePublicMapService.junctionHasSegmentToUpdatePublicMap(com.th.data.personal.PersonalTrailJunction,java.util.List) 13:14:40,881 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [linkPersonalTrailSegmentsAndJunctions] with attribute [PROPAGATION_required,881 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public void com.th.service.UpdatePublicMapService.linkPersonalTrailSegmentsAndJunctions(com.th.data.personal.PersonalRoute,881 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [createTrailJunction] with attribute [PROPAGATION_required,882 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public com.th.service.SplitResult com.th.service.UpdatePublicMapService.createTrailJunction(java.lang.String,long) 13:14:40,882 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [copyPersonalPublicTrailSegments] with attribute [PROPAGATION_required,882 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public void com.th.service.UpdatePublicMapService.copyPersonalPublicTrailSegments(java.util.Collection,883 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [deleteReplacedPublicTrailSegments] with attribute [PROPAGATION_required,883 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public void com.th.service.UpdatePublicMapService.deleteReplacedPublicTrailSegments(java.util.Collection) 13:14:40,883 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [setPersonalRouteDataGateway] with attribute [PROPAGATION_required,885 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public void com.th.service.UpdatePublicMapService.setPersonalRouteDataGateway(com.th.data.personal.PersonalRouteDataGateway) 13:14:40,886 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [setPersonalTrailSegmentDataGateway] with attribute [PROPAGATION_required,886 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public void com.th.service.UpdatePublicMapService.setPersonalTrailSegmentDataGateway(com.th.data.personal.PersonalTrailSegmentDataGateway) 13:14:40,887 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [setPersonalTrailDataGateway] with attribute [PROPAGATION_required,887 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public void com.th.service.UpdatePublicMapService.setPersonalTrailDataGateway(com.th.data.personal.PersonalTrailDataGateway) 13:14:40,888 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [setPersonalTrailJunctionDataGateway] with attribute [PROPAGATION_required,888 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public void com.th.service.UpdatePublicMapService.setPersonalTrailJunctionDataGateway(com.th.data.personal.PersonalTrailJunctionDataGateway) 13:14:40,889 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [setPublicTrailDataGateway] with attribute [PROPAGATION_required,889 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public void com.th.service.UpdatePublicMapService.setPublicTrailDataGateway(com.th.data.pub.PublicTrailDataGateway) 13:14:40,890 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [setPublicTrailSegmentDataGateway] with attribute [PROPAGATION_required,890 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public void com.th.service.UpdatePublicMapService.setPublicTrailSegmentDataGateway(com.th.data.pub.PublicTrailSegmentDataGateway) 13:14:40,891 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [setPersonalPublicTrailSegmentDataGateway] with attribute [PROPAGATION_required,891 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public void com.th.service.UpdatePublicMapService.setPersonalPublicTrailSegmentDataGateway(com.th.data.personal.PersonalPublicTrailSegmentDataGateway) 13:14:40,891 DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method [setPublicTrailJunctionDataGateway] with attribute [PROPAGATION_required,892 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public void com.th.service.UpdatePublicMapService.setPublicTrailJunctionDataGateway(com.th.data.pub.PublicTrailJunctionDataGateway) 13:14:40,892 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException 13:14:40,892 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Found 'equals' method: public boolean java.lang.Object.equals(java.lang.Object) 13:14:40,892 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Found finalize() method - using NO_OVERRIDE 13:14:40,892 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Found 'hashCode' method: public native int java.lang.Object.hashCode() 13:14:40,893 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Unable to apply any optimisations to advised method: public java.lang.String java.lang.Object.toString() 13:14:40,893 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.isFrozen() 13:14:40,893 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.isProxyTargetClass() 13:14:40,893 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract java.lang.Class[] org.springframework.aop.framework.Advised.getProxiedInterfaces() 13:14:40,893 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.isInterfaceProxied(java.lang.Class) 13:14:40,894 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.setTargetSource(org.springframework.aop.TargetSource) 13:14:40,894 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract org.springframework.aop.TargetSource org.springframework.aop.framework.Advised.getTargetSource() 13:14:40,895 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.setExposeProxy(boolean) 13:14:40,895 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.isExposeProxy() 13:14:40,896 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.setPreFiltered(boolean) 13:14:40,896 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.isPreFiltered() 13:14:40,896 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract org.springframework.aop.Advisor[] org.springframework.aop.framework.Advised.getAdvisors() 13:14:40,897 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.addAdvisor(org.springframework.aop.Advisor) throws org.springframework.aop.framework.AopConfigException 13:14:40,897 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.addAdvisor(int,org.springframework.aop.Advisor) throws org.springframework.aop.framework.AopConfigException 13:14:40,897 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.removeAdvisor(org.springframework.aop.Advisor) 13:14:40,898 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.removeAdvisor(int) throws org.springframework.aop.framework.AopConfigException 13:14:40,898 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract int org.springframework.aop.framework.Advised.indexOf(org.springframework.aop.Advisor) 13:14:40,898 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.replaceAdvisor(org.springframework.aop.Advisor,898 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.addAdvice(org.aopalliance.aop.Advice) throws org.springframework.aop.framework.AopConfigException 13:14:40,898 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.addAdvice(int,org.aopalliance.aop.Advice) throws org.springframework.aop.framework.AopConfigException 13:14:40,900 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.removeAdvice(org.aopalliance.aop.Advice) 13:14:40,904 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract int org.springframework.aop.framework.Advised.indexOf(org.aopalliance.aop.Advice) 13:14:40,904 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract java.lang.String org.springframework.aop.framework.Advised.toProxyConfigString() 13:14:40,907 DEBUG [org.springframework.aop.framework.cglib2AopProxy] - Method is declared on Advised interface: public abstract java.lang.Class org.springframework.aop.TargetClassAware.getTargetClass() 13:14:44,767 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Finished creating instance of bean 'updatePublicMapService' 13:14:44,768 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'personalController' to bean named 'updatePublicMapService' ... 13:15:50,637 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Processing injected method of bean 'personalController': AutowiredMethodElement for public void com.th.rest.personal.trailsegment.PersonalController.setUpdatePublicMapService(com.th.service.UpdatePublicMapService) 13:15:50,638 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Creating shared instance of singleton bean 'updatePublicMapService' 13:15:50,638 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Creating instance of bean 'updatePublicMapService' 13:15:50,646 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Found injected element on class [com.th.service.UpdatePublicMapService]: AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPersonalRouteDataGateway(com.th.data.personal.PersonalRouteDataGateway) 13:15:50,646 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Found injected element on class [com.th.service.UpdatePublicMapService]: AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPersonalTrailSegmentDataGateway(com.th.data.personal.PersonalTrailSegmentDataGateway) 13:15:50,646 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Found injected element on class [com.th.service.UpdatePublicMapService]: AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPersonalTrailDataGateway(com.th.data.personal.PersonalTrailDataGateway) 13:15:50,646 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Found injected element on class [com.th.service.UpdatePublicMapService]: AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPersonalTrailJunctionDataGateway(com.th.data.personal.PersonalTrailJunctionDataGateway) 13:15:50,647 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Found injected element on class [com.th.service.UpdatePublicMapService]: AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPublicTrailDataGateway(com.th.data.pub.PublicTrailDataGateway) 13:15:50,647 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Found injected element on class [com.th.service.UpdatePublicMapService]: AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPublicTrailSegmentDataGateway(com.th.data.pub.PublicTrailSegmentDataGateway) 13:15:50,647 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Found injected element on class [com.th.service.UpdatePublicMapService]: AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPersonalPublicTrailSegmentDataGateway(com.th.data.personal.PersonalPublicTrailSegmentDataGateway) 13:15:50,647 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Found injected element on class [com.th.service.UpdatePublicMapService]: AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPublicTrailJunctionDataGateway(com.th.data.pub.PublicTrailJunctionDataGateway) 13:15:50,648 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Eagerly caching bean 'updatePublicMapService' to allow for resolving potential circular references 13:15:50,648 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Processing injected method of bean 'updatePublicMapService': AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPersonalRouteDataGateway(com.th.data.personal.PersonalRouteDataGateway) 13:15:50,649 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Returning cached instance of singleton bean 'personalRouteDataGatewayImpl' 13:15:50,649 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'updatePublicMapService' to bean named 'personalRouteDataGatewayImpl' 13:15:50,649 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Processing injected method of bean 'updatePublicMapService': AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPersonalTrailSegmentDataGateway(com.th.data.personal.PersonalTrailSegmentDataGateway) 13:15:50,650 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Returning cached instance of singleton bean 'personalTrailSegmentDataGatewayImpl' 13:15:50,650 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'updatePublicMapService' to bean named 'personalTrailSegmentDataGatewayImpl' 13:15:50,650 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Processing injected method of bean 'updatePublicMapService': AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPersonalTrailDataGateway(com.th.data.personal.PersonalTrailDataGateway) 13:15:50,651 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Returning cached instance of singleton bean 'personalTrailDataGatewayImpl' 13:15:50,652 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'updatePublicMapService' to bean named 'personalTrailDataGatewayImpl' 13:15:50,652 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Processing injected method of bean 'updatePublicMapService': AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPersonalTrailJunctionDataGateway(com.th.data.personal.PersonalTrailJunctionDataGateway) 13:15:50,652 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Returning cached instance of singleton bean 'personalTrailJunctionDataGatewayImpl' 13:15:50,653 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'updatePublicMapService' to bean named 'personalTrailJunctionDataGatewayImpl' 13:15:50,653 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Processing injected method of bean 'updatePublicMapService': AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPublicTrailDataGateway(com.th.data.pub.PublicTrailDataGateway) 13:15:50,654 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Returning cached instance of singleton bean 'publicTrailDataGatewayImpl' 13:15:50,654 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'updatePublicMapService' to bean named 'publicTrailDataGatewayImpl' 13:15:50,654 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Processing injected method of bean 'updatePublicMapService': AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPublicTrailSegmentDataGateway(com.th.data.pub.PublicTrailSegmentDataGateway) 13:15:50,655 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Returning cached instance of singleton bean 'publicTrailSegmentDataGatewayImpl' 13:15:50,655 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'updatePublicMapService' to bean named 'publicTrailSegmentDataGatewayImpl' 13:15:50,655 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Processing injected method of bean 'updatePublicMapService': AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPersonalPublicTrailSegmentDataGateway(com.th.data.personal.PersonalPublicTrailSegmentDataGateway) 13:15:50,656 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Returning cached instance of singleton bean 'personalPublicTrailSegmentDataGatewayImpl' 13:15:50,656 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'updatePublicMapService' to bean named 'personalPublicTrailSegmentDataGatewayImpl' 13:15:50,656 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Processing injected method of bean 'updatePublicMapService': AutowiredMethodElement for public void com.th.service.UpdatePublicMapService.setPublicTrailJunctionDataGateway(com.th.data.pub.PublicTrailJunctionDataGateway) 13:15:50,657 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Creating shared instance of singleton bean 'publicTrailJunctionDataGatewayImpl' 13:15:50,657 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Creating instance of bean 'publicTrailJunctionDataGatewayImpl' 13:15:50,659 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Eagerly caching bean 'publicTrailJunctionDataGatewayImpl' to allow for resolving potential circular references 13:15:50,659 DEBUG [org.springframework.beans.factory.annotation.InjectionMetadata] - Processing injected method of bean 'publicTrailJunctionDataGatewayImpl': AutowiredMethodElement for public void com.th.data.pub.impl.PublicTrailJunctionDataGatewayImpl.setDataSource(javax.sql.DataSource) 13:15:50,660 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Returning cached instance of singleton bean 'dataSource' 13:15:50,660 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'publicTrailJunctionDataGatewayImpl' to bean named 'dataSource' 13:15:50,661 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Finished creating instance of bean 'publicTrailJunctionDataGatewayImpl' 13:15:50,661 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'updatePublicMapService' to bean named 'publicTrailJunctionDataGatewayImpl' 13:15:50,661 DEBUG [org.springframework.beans.factory.support.DefaultListablebeanfactory] - Finished creating instance of bean 'updatePublicMapService' 13:15:50,661 DEBUG [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - Autowiring by type from bean name 'personalController' to bean named 'updatePublicMapService'
Solution
I solved it Spring loads two application contexts in such a way that two update public map services are loaded
Contextloaderlistener loads the root application context In my example, it finds and loads updatepoublicmaservice. XML using the transaction wrapper
Then the dispatcher servlet loads and reads < name > - servlet xml. As far as I am concerned, it once contained < context: component scan base package = "com. Th" / > it scanned and loaded updatepoublicmaservice again – but there was no transaction wrapper
The solution is to modify the component scan configuration so that I only see what I want to load in the servlet, not the root application context