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

如何在Spring单例控制器中注入原型bean

夏新翰
2023-03-14

我有一个用于原型bean的FactoryBean,如下所示:

@Component
public class ApplicationConfigurationMergedPropertiesFactoryBean implements SmartFactoryBean<Properties>{

    @Autowired
    protected ApplicationConfigurationInitializer initializer;

    @Override
    public Properties getObject() throws Exception {
        return XXXXXXXXXX;
    }

    @Override
    public Class<?> getObjectType() {
        return Properties.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }

    @Override
    public boolean isPrototype() {
        return true;
    }

我希望在控制器中自动连接它,并且每当我尝试访问属性时(通过p.get(),从ApplicationConfigurationMergedPropertiesFactoryBean.getObject()获得一个新的原型实例:

@Controller
@RequestMapping("/home")
public class HomeController {

  @Autowired
  @Qualifier("applicationConfig")
  private Properties p;

  @RequestMapping(method = { RequestMethod.GET, RequestMethod.POST })
  public String home() {
        System.out.println(p.get("something"));
  }

但是,这从来不会调用getObject()。如果我注入ApplicationContext一个直接访问bean,它就会工作,提供一个全新的属性bean:

@Controller
@RequestMapping("/home")
public class HomeController {

    @Autowired
    @Qualifier("applicationConfig")
    private Properties p;

    @Autowired
    private ApplicationContext ac;

    @RequestMapping(method = { RequestMethod.GET, RequestMethod.POST })
    public String home() {
        System.out.println(p.get("something"));  //WRONG!!!!
        System.out.println(ac.getBean("applicationConfig", Properties.class).getProperty("something")); //OK!!!!

如何直接使用@autowired注入来实现?

共有1个答案

秦诚
2023-03-14

您是否也考虑过使您的controller类具有原型作用域?

@Controller
@Scope("prototype")
@RequestMapping("/home")
public class HomeController {
 类似资料:
  • 我刚接触Spring,正在尝试理解“将一个原型bean注入一个单例bean”的概念。根据我在singleton中的理解,每个Spring IoC容器只有一个实例,不管您检索它多少次。,因为仍未实例化。我开发了以下示例,其中在单个bean中给出了原型bean的参考,如下所示: RequestProcessor.java requestValidator.java 如何解决?我的理解正确吗? 另一种方

  • 我使用和注释来注入一个原型bean。 然而,注入bean的行为类似于单例bean。有没有办法在mockito中注入一个原型范围bean? 我正在使用运行JUnit,并使用运行初始化模拟。

  • 我目前有一个简单的bean作为pojo,我正在将其注入到工作线程中,工作线程是用定义的。 我发现bean被正确地注入到原型中,被重新初始化,并且所有的值都返回。 下面是注入的代码: POJO: } 我知道bean正在重新创建,因为调试器中的ID发生了变化,并且被打印到控制台。 用这种方式将单例注入到原型中有什么问题吗? 多谢了。

  • 问题内容: 我仍然是Angularjs的新手。我想在控制器中动态注入服务(我创建的)的依赖项。 但是,当我对具有依赖项的服务进行编码时,出现此错误: 错误:未知提供程序:$ windowProvider <-$ window <-base64 这是控制器的代码。 此代码有效: 此代码不起作用: 另一个问题是服务与控制器位于同一模块中。如果模块具有依赖项,则无法使用(我的模块配置中具有$ route

  • 我对控制器对象有点困惑。据我所知,默认情况下,控制器是单例的。singleton是如何为web应用程序工作的,如下面的代码中所示,如果线程1执行到第9行,empId为12,线程2从线程1获得控制,empId为23,并完成整个方法的执行,那么当线程1再次执行时,empId的值将是12或23。 我还注意到,UserServiceDao类只创建了一个对象,所以在spring mvc中线程是如何管理的,每

  • 我正在使用 Spring 3.1.1,在我的业务逻辑中,我有一个循环,每次迭代都需要一个新的 Spring bean(原型范围)实例。 最好的方法是什么?我是否必须创建自己的 BeanFactory 类,我可以将其注入一次到我的类中,并且每次都调用它来生成 bean?在查看 Spring 3 文档时,它似乎暗示我应该改用 ApplicationContext。但是,使用ApplicationCon