2015-10-05 39 views
1

我有這樣的原型豆類一個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的訪問,它的工作原理,提供了一個全新的屬性豆:

@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注入來實現?

+0

你不能只是注入ApplicationConfigurationMergedPropertiesFactoryBean嗎? – WeMakeSoftware

+0

可能的重複:http://stackoverflow.com/questions/7621920/scopeprototype-bean-scope-not-creating-new-bean –

回答

0

你有沒有考慮過讓你的控制器類原型作用域呢?

@Controller 
@Scope("prototype") 
@RequestMapping("/home") 
public class HomeController { 
+0

我寧願它是一個單例,我也不需要一個新的控制器實例對於每一個請求... – codependent

+0

得到亞,是啊這是我知道你可以完成你想要的東西,而無需明確地調用你的工廠的每一個請求的唯一途徑。我曾經覺得不需要爲每個請求創建控制器,但是如果它實現了你想要的行爲,並且讓Spring處理你不需要的東西想要明確。您可能會發現,如果您每次測量創建控制器的性能時都會增加可忽略的開銷。 – Nate

0

注入廠家直接:

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

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

    @Autowired 
    private ApplicationContext ac; 

    @RequestMapping(method = { RequestMethod.GET, RequestMethod.POST }) 
    public String home() { 
     System.out.println(p.getObject()); 
    .... 
    } 
+0

是的,這是一個解決方案。我想知道是否有比直接調用工廠更少的手工操作。就像你有一個@Scoped(「會話」或「請求」)bean,它會在控制器中爲每個請求自動刷新一次 – codependent