为什么Injected bean ApplicationScope没有生产者跟着

时间:2013-10-04 14:59:33

标签: java cdi

我有一个类Triangle,DrawingTool,Main类和一个名为MyProducer的生产者类。 Producer类有一个方法,它将Triangle实例注入到DrawingTool类中。我没有为producer方法和DrawingTool类提供范围(默认为@Dependent)。但是,我为Triangle类指定了@ApplicationScoped注释。 当我两次查找DrawingTool类时,我将2个不同的Circle实例注入到DrawingTool实例中。为什么? 这是代码

public class DrawingTool {


 @Inject @ShapeType(value= ShapeNames.TRIANGLE)
   private Shape triangle;



public Shape getTriangle() {
    return triangle;
}


public void drawShape(Shape s)
{
       s.draw();
}

//////////////////////////////////////////////////
@ApplicationScoped

public class Triangle implements Shape{

private String color;

public String getColor() {
    return color;
}

public void setColor(String color) {
    this.color = color;
}

@Inject
private Logger logger;

 public void draw() {
    logger.info("drawing triangle " + color);
}

}

///////////////////////////////////////////////////////////////////

 public class MyProducer {

 @Produces
 @ShapeType(value= ShapeNames.TRIANGLE)
 public Shape getTriangle( Triangle t)
 {
     t.setColor("green");
    return t;
 }

}

////////////////////////////////////////////////////////////////

public static void main( String[] args )
{


    Weld weld = new Weld();
    WeldContainer container = weld.initialize();

    DrawingTool tool = container.instance().select(DrawingTool.class).get();

    tool.drawShape(tool.getTriangle());
    // change property of triangle to check for instance
    tool.getTriangle().setColor("dark Green");
    tool.drawShape(tool.getTriangle());


    DrawingTool tool1 = container.instance().select(DrawingTool.class).get();

    tool1.drawShape(tool1.getTriangle());

    weld.shutdown();
} 

/////////////////////////////////////

我得到以下输出

信息:绘制三角形绿色

信息:绘制三角形深绿色

信息:绘制三角形 绿色

我期待最后一次打印是深绿色,因为它应该是同一个应该在两个DrawingTool实例中注入的Triangle实例。请解释为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

依赖的作用域bean的行为方式与使用new自己实例化bean的新实例的方式相同。生产者覆盖已经在bean上的任何其他东西。在这里,您没有向生产者添加范围,因此它将假设Dependent,因为您没有在生产者方法上指定。我希望有所帮助。