SPRING:在春天由工厂瞬间创建的bean中使用自动装配

时间:2014-09-09 07:02:25

标签: spring

您好我无法将我的bean自动装入使用工厂方法实例化的另一个bean中。

class A{

    private String name;

    //getters and setters for name
}

class B{

    @Autowired
    private A x;

    private B(String Gender, String jobProfile){
        String name = x.getName();
       //some code
    }

    public static getInstance(String Gender,String jobProfile){
        //some code for instantiation.
    }
}        

现在,当我使用工厂方法从一些不同的类创建类B的实例时。自动装配不会发生,它返回NULL,即x将变为空。因此,在此

上调用getName时,我得到空指针异常

你有解决方案吗?或者我正在做一些事情?

2 个答案:

答案 0 :(得分:1)

当你用new创建一个对象时,autowire \ inject不会工作......

作为解决方法,你可以试试这个:

    

以这种方式创建一个istance

context.getBean("myBean");

PROTOTYPE :这可以使单个bean定义包含任意数量的对象实例。


配置

<bean id="a" class="..." >
<bean id="b" class="..." scope="prototype">
<bean id="factory" class="..." >

工厂类

public class Factory implements ApplicationContextAware {

    private ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {
        this.applicationContext = applicationContext;
    }

    public B createClass(){
        context.getBean("b");
    }

    public B createClass(Object... args){
        context.getBean("b",args);
    }

    }

通过这种方式,Autowired注释可以正常工作。

正如Javadocs所说的getBean ..

/**
     * Return an instance, which may be shared or independent, of the specified bean.
     * <p>Allows for specifying explicit constructor arguments / factory method arguments,
     * overriding the specified default arguments (if any) in the bean definition.
     * @param name the name of the bean to retrieve
     * @param args arguments to use if creating a prototype using explicit arguments to a
     * static factory method. It is invalid to use a non-null args value in any other case.
     * @return an instance of the bean
     * @throws NoSuchBeanDefinitionException if there is no such bean definition
     * @throws BeanDefinitionStoreException if arguments have been given but
     * the affected bean isn't a prototype
     * @throws BeansException if the bean could not be created
     * @since 2.5
     */
    Object getBean(String name, Object... args) throws BeansException;

答案 1 :(得分:1)

@Autowired文档中,表示字段在对象构建后自动装配。

因此,在您的代码中,当您尝试在构造函数中使用x时,Spring没有喷射x.getName()


您有几种选择:

  • 将A x移动到构造函数
  • 将初始化逻辑移出构造函数