Spring init-method params

时间:2011-09-13 11:27:50

标签: spring

我是Spring的新手,我想询问是否可以将params传递给init并销毁bean的方法。

感谢。

3 个答案:

答案 0 :(得分:11)

不,你不能。如果您需要参数,则必须事先将它们作为字段注入。

示例Bean

public class Foo{

    @Autowired
    private Bar bar;

    public void init(){
        bar.doSomething();
    }

}

示例XML:

<bean class="Foo" init-method="init" />

答案 1 :(得分:2)

当您无法像上一个答案中那样更改要创建的类时,此方法尤其有用,但您正在使用API​​,并且必须按原样使用提供的bean。

你总是可以创建一个实现FactoryBean的类(MyObjectFactory),并且在你应该编写的getObject()方法中:

@Autowired
private MyReferenceObject myRef;
public Object getObject()
{
    MyObject myObj = new MyObject();
    myObj.init(myRef);
    return myObj;
}

在spring context.xml中你会有一个简单的:

<bean id="myObject" class="MyObjectFactory"/>

答案 2 :(得分:0)

    protected void invokeCustomInitMethod(String beanName, Object bean, String initMethodName)
        throws Throwable {

    if (logger.isDebugEnabled()) {
        logger.debug("Invoking custom init method '" + initMethodName +
                "' on bean with beanName '" + beanName + "'");
    }
    try {
        Method initMethod = BeanUtils.findMethod(bean.getClass(), initMethodName, null);
        if (initMethod == null) {
            throw new NoSuchMethodException("Couldn't find an init method named '" + initMethodName +
                    "' on bean with name '" + beanName + "'");
        }
        if (!Modifier.isPublic(initMethod.getModifiers())) {
            initMethod.setAccessible(true);
        }
        initMethod.invoke(bean, (Object[]) null);
    }
    catch (InvocationTargetException ex) {
        throw ex.getTargetException();
    }
}

查看Method initMethod = BeanUtils.findMethod(bean.getClass(), initMethodName, null);中的spring soruce代码 init方法是find,param是null