For those looking for an example, here is a quick one I came up with that uses postProcessBeforeInitialization.
Code:
public interface Foo {
public void add();
}
public class FooImpl implements Foo {
private int size;
private String name;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void add() {
// Do stuff
}
}
public class FooFactory implements BeanPostProcessor {
private ObjectFactory objectFactory;
ThreadLocal arguments;
// Assumes using a ObjectFactoryCreatingFactoryBean for injecting prototype bean
public void setObjectFactory(ObjectFactory objectFactory) {
this.objectFactory = objectFactory;
}
public Foo getFoo(String name, int size) {
Object[] args = { name, new Integer(size) };
arguments.set(args);
try {
return (Foo) objectFactory.getObject();
} finally {
arguments.set(null);
}
}
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
Object[] args;
if (bean instanceof FooImpl && (args = (Object[]) arguments.get()) != null) {
FooImpl fooBean = (FooImpl)bean;
fooBean.setName((String) args[0]);
fooBean.setSize(((Integer)args[1]).intValue());
}
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}