Spring Boot @Autowired在运行时创建实例

时间:2015-11-16 16:50:48

标签: java spring dependency-injection spring-boot autowired

作为大多数Spring Boot新用户,我遇到了@Autowired:D

的问题

我已经在这里引用了关于此注释的大量主题但是仍然找不到适合我问题的解决方案。

假设我们有这个Spring Boot层次结构:

instance=self.request.user

类,我们想在每次调用它时实例化:

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

输出控制器,每次请求都会创建新的SomeRepo对象:

@Service
public class TestWire {
    public TestWire() {
        System.out.println("INSTANCE CREATED: " + this);
    }
}

最后,使用@Autowired创建TestWire实例的类:

@RestController
public class CreatingRepo {
    @RequestMapping("/")
    public void postMessage() {
        SomeRepo repo = new SomeRepo();
    }
}

让我们假设,我们向" /"发出GET请求。好几次。

因此,因此,只有在项目构建时,TestWire类才会实现,并且 @Scope(值="原型") proxyMode = ScopedProxyMode.TARGET_CLASS 不会帮忙。

如何在运行时创建新实例?我的意思是,我们怎样才能在" Spring方式"?没有工厂和其他东西,只有Spring DI通过注释和配置。

UPD。一段堆栈跟踪,其中创建了实例:

public class SomeRepo {
    @Autowired
    private TestWire testWire;

    public SomeRepo() {
        System.out.println(testWire.toString());
    }
}

1 个答案:

答案 0 :(得分:7)

如果我理解你是正确的,你需要注释SomeRepo这样:

@Service
@Scope(value = "prototype")
public class SomeRepo { 
// ...
}

选项A:

您可以向new SomeRepo();询问BeanFactory.getBean(...),而不是使用@RestController public class CreatingRepo { @Autowired BeanFactory beanFactory; @RequestMapping("/") public void postMessage() { // instead of new SomeBean we get it from the BeanFactory SomeRepo repo = beanFactory.getBean(SomeRepo.class); } } 来实例化该课程。

beanFactory

选项B:

你也应该能够像这样获得Bean(超过没有@RestController public class CreatingRepo { @RequestMapping("/") public void postMessage(SomeRepo repo) { // instead of the BeanFactory and using new SomeRepo you can get it like this. } } 的参数):

parsed = phonenumbers.parse(number, 'US')