В обьявлении этих бинов нет ничего сложного:
Но проблема появляется, когда нужна зависимость SingletonBean от PrototypeBean. В этом случае можно поступить несколькими способами:
ApplicationContextAware или BeanNameAware method injection; Lookup method injection; Arbitrary method replacement.
Расскажу о самом простом (по крайней мере для меня) из них - аналоге BeanNameAware.
PrototypeBean может представлять из себя что угодно. В данном контексте нам это не важно, так что будем рассматривать его просто как POJO класс:
public class PrototypeBean { ... }
а в SingletonBean используем фабрику org.springframework.beans.factory.ObjectFactory:
public class SingletonBean { private ObjectFactory factory; public void createPrototypeBean() { //здесь можем получить сколько угодно экземпляров PrototypeBean PrototypeBean bean = factory.getObject(); } ... public void setFactory(ObjectFactory beanFactory) throws BeansException { this.factory = beanFactory; } }
Чтобы явно указать ObjectFactory экземпляр какого бина создавать, в конфигурации пропишем ObjectFactory как property Singleton-бина: