没有类级别对象的方法中的Spring Injection

时间:2013-02-27 15:34:04

标签: spring

如何通过弹簧注入以下场景。

Class A{

public void doSomeThing(){
 B builder=new B();
 //call other function.
}

}

在这里,我不想将B作为类级对象。

Class A{
 B b;// dont want to bring b here
}

我也不想使用Spring context.getBean(“B)或autowire;

所以Spring必须以这样的方式注入B:

Class A{

public void doSomeThing(){
 B builder=<injected by Spring>
 //call other function.
}

}

所以B在doSomeThing()方法的范围内被创建和销毁。

3 个答案:

答案 0 :(得分:2)

您可以使用ApplictionContext来执行此操作

Class A{
    @Autowire
    private ApplicationContext appContext;

    public void doSomeThing(){
        B builder=appContext.getBean(B.class);
    }
}

如果您希望每次调用B时都有appContext.getBean(B.class)的不同实例,那么您需要将B的bean定义为prototype scoped bean。

答案 1 :(得分:0)

所以你可能想要这样的东西:

class A {
    B b;

    public void doSomething() {
        b.something();
    }

    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }
}

class B {
    public void something() {
        System.out.println("something");
    }
}

然后您的XML配置将是:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  <bean id="a"  class="A">
    <property name="b" ref="b"/>
  </bean>

  <bean id="b" class="B"/>

</beans>

答案 2 :(得分:0)

你可以在spring中通过lookup-method来做到这一点。创建一个抽象方法createB(); 并且你使该类也是抽象的但不要担心spring会创建一个抽象类的具体代理对象。

@style/TextAppearance.AppCompat.Widget.ActionBar.Title