当前位置: 首页 > 知识库问答 >
问题:

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

柯波峻
2023-03-14

作为大多数Spring Boot新用户,我对@Autow的问题:D

我已经在这里阅读了大量有关此注释的主题,但仍然无法找到解决问题的正确方法。

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

@SpringBootApplication
public class DemoApplication {

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

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

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

Out get controller,它会在每个请求中创建新的SomeRepo对象

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

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

public class SomeRepo {
    @Autowired
    private TestWire testWire;

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

假设我们多次向“/”发出GET请求。

因此,TestWire类只有在项目构建时才会出现问题,@Scope(value="原型")和proxyMode=ScopedProxyMode都不会出现问题。TARGET_CLASS不会有帮助。

如何在运行时创建新实例?我是说,我们怎么能用“Spring的方式”来做呢?没有工厂和其他东西,只有通过注释和配置的Spring DI。

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

2015-11-16 20:30:41.032  INFO 17696 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
INSTANCE CREATED: com.example.TestWire@56c698e3
2015-11-16 20:30:41.491  INFO 17696 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@12f41634: startup date [Mon Nov 16 20:30:37 MSK 2015]; root of context hierarchy
2015-11-16 20:30:41.566  INFO 17696 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto public void com.example.CreatingRepo.postMessage()

共有1个答案

姚建树
2023-03-14

如果我理解你的意思,你需要对SomeRepo进行如下注释:

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

选项A:

而不是用new某个Repo()实例化类;您向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);
    }
}

选项B:

您还应该能够像这样获取Bean(在没有beanFactory参数上):

@RestController
public class CreatingRepo {

    @RequestMapping("/")
    public void postMessage(SomeRepo repo) {
        // instead of the BeanFactory and using new SomeRepo you can get it like this.
    }
}
 类似资料:
  • 问题内容: 是否可以在运行时创建hibernate的Entity类(带有注释)?它应与也在运行时中添加的表相关。重要的是,该实体应该对Hibernate可见。一般情况下是否可能,请您给我有关该问题的任何建议吗?我了解,反射是关键字,但需要更多的单词。问候。 问题答案: 在这种情况下,您可能希望在运行时以编程方式创建Hibernate Session Factory,并传入创建的新映射,请访问htt

  • 问题内容: 是否可以在运行时创建休眠的Entity类(带有注释)?它应该与也在运行时添加的表相关。重要的是,该实体应该对Hibernate可见。一般情况下是否可能,请您给我有关该问题的任何建议吗?我了解,反射是关键字,但需要更多的单词。问候。 问题答案: 在这种情况下,您可能希望在运行时以编程方式创建Hibernate Session Factory,传入您创建的新映射,并查看http://doc

  • 我正在尝试dockerize一个Spring启动服务。我开始参考这篇文章。我能够建立图像,但不能运行它。当我试图运行容器时,它失败了,错误如下。 OCI运行时创建失败:container_linux.go:345:启动容器进程导致\“exec:\\”catalina.sh\\“:在$path\”中找不到可执行文件:未知 我使用的是Windows10Docker桌面,我尝试使用其他基本图像,重置Do

  • 我试图根据用户输入动态创建一个单声道序列。我正在调用rest API并在Mono中获得ClientResponse。我的用例是在一个序列中调用2个或多个API,下一个API的输入负载取决于前一个API的输出。 我的硬编码序列操作看起来像 这是很好的工作,但我想让这个方法通用。我想从用户的POJO列表中获取所有必需的参数,并基于列表输入创建flatMap序列。因此,如果列表的长度为2,则将有2个平面

  • 本文向大家介绍C#在运行时动态创建类型的实现方法,包括了C#在运行时动态创建类型的实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#在运行时动态创建类型的实现方法。是C#项目开发中很实用的技巧。分享给大家供大家参考。具体分析如下: 具体来说,C# 在运行时动态的创建类型是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型的。 主要功能代码如下: 希望本文所述