Prototype Bean doesn't get autowired as expected

后端 未结 5 822
南旧
南旧 2021-02-05 04:14

TestController.java

@RestController
public class TestController {

    @Autowired
    private TestClass testClass;

    @RequestMapping(value = \"/test\", method         


        
5条回答
  •  迷失自我
    2021-02-05 04:41

    The key point hear is that the restController bean is a singleton and Spring will create only one instance of that bean during the creation of bean.

    When you impose a prototype bean scope Spring will instance a new bean for every DI point. In other words if you configure a bean a two or n-times via xml or java-config this bean will have a fresh instance of your prototype-scoped bean.

    In your case you use the annotation style that actually is the default way for web layer starting spring 3.x.

    One possibility to inject a fresh bean may be achieved with a bean scoped on the session, but in my opinion if your use case is a rest WS that I consider stateless, the session use in my opinion is a bad choice.

    A solution of your case may be use request scope.

    Update I write also just a simple example

         @SpringBootApplication
         public class DemoApplication {
    
            public static void main(String[] args) {
                SpringApplication.run(DemoApplication.class, args);
            }
    
            @Bean
            @Scope(scopeName = "request",proxyMode = ScopedProxyMode.TARGET_CLASS)
            public RequestBeanTest requestBeanTest(){
                return new RequestBeanTest();
            }
    
        }
    
        class RequestBeanTest {
            public RequestBeanTest(){
                Random random = new Random();
                System.out.println(random.nextGaussian());
                System.out.println("new object was created");
            }
    
            private String prop;
    
            public String execute(){
    
                return "hello!!!";
            }
    
            public String getProp() {
                return prop;
            }
    
            public void setProp(String prop) {
                this.prop = prop;
            }
        }
    
    
        @RestController
        class RestTemplateTest {
    
            @Autowired
            private RequestBeanTest requestBeanTest;
    
            @RequestMapping("/testUrl")
            public ResponseEntity responseEntity(){
                requestBeanTest.setProp("test prop");
    
                System.out.println(requestBeanTest.getProp());
                return ResponseEntity.ok(requestBeanTest.execute());
            }
        }
    

    the my pom.xml

    
    
        4.0.0
    
        com.example
        demo
        0.0.1-SNAPSHOT
        jar
    
        demo
        Demo project for Spring Boot
    
        
            org.springframework.boot
            spring-boot-starter-parent
            1.3.3.RELEASE
             
        
    
        
            UTF-8
            1.8
        
    
        
            
                org.springframework.boot
                spring-boot-starter
            
    
            
                org.springframework.boot
                spring-boot-starter-actuator
            
            
                org.springframework.boot
                spring-boot-starter-web
            
    
    
            
                org.springframework.boot
                spring-boot-starter-test
                test
            
        
    
        
            
                
                    org.springframework.boot
                    spring-boot-maven-plugin
                
            
        
    
    

    the bowser screen:

    and the my log screen:

    I don't know why it don't work for you probably you had forgot some configuration.

    I hope that this more detalied solution can help you to understand how solve the your problem

提交回复
热议问题