0

我有一个类 Triangle、DrawingTool、Main 类和一个名为 MyProducer 的生产者类。Producer 类有一个将 Triangle 实例注入到 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 实例。请解释为什么会这样?

4

1 回答 1

1

依赖作用域 bean 的行为本质上与您自己使用new. 生产者覆盖 bean 上已经存在的任何其他内容。在这里,您没有向生产者添加范围,因此它将假定为 Dependent,因为您没有在生产者方法中指定它。我希望这会有所帮助。

于 2013-10-04T21:58:41.900 回答