我有一個類Triangle,DrawingTool,Main類和一個名爲MyProducer的生產者類。 Producer類有一個將Triangle實例注入到DrawingTool類的方法。我沒有向生產者方法和DrawingTool類提供範圍(默認爲@Dependent)。但是,我爲Triangle類指定了@ApplicationScoped註釋。 當我查找DrawingTool類兩次時,我將2個不同的Circle實例注入到DrawingTool實例中。爲什麼? 這裏是代碼爲什麼Injected bean ApplicationScope沒有被生產者遵循
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情況下被注射。請解釋爲什麼會發生這種情況?
如果生產者覆蓋了bean所具有的任何範圍,那麼爲什麼當我們在生產者方法參數中注入bean時,我們需要在新的註釋中?三角形bean提到了@ApplicationScoped,而在DrawingTool中注入三角形bean的DrawingTool bean和生產者方法具有默認的相關範圍。所以,我期待Traingle bean範圍(應用程序範圍)將被生產者方法所尊重。如果我想要Trailing bean範圍被覆蓋,我會在方法論中重新提到,我沒有。 – Mayur
你有Bean Triangle,但是它被生產者覆蓋了,所以實際注入的是一個新的依賴的scoped bean。如果你調試你的應用程序,你應該能夠看到這個。 – LightGuard
感謝LightGuard。我現在已經明白了。 – Mayur