我有一个类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实例。请解释为什么会发生这种情况?
答案 0 :(得分:1)
依赖的作用域bean的行为方式与使用new
自己实例化bean的新实例的方式相同。生产者覆盖已经在bean上的任何其他东西。在这里,您没有向生产者添加范围,因此它将假设Dependent,因为您没有在生产者方法上指定。我希望有所帮助。