2013-10-04 20 views
0

我有一個類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情況下被注射。請解釋爲什麼會發生這種情況?

回答

1

從屬作用域bean本質上的作用方式與您自己用new自己實例化一個新的bean實例的方式相同。生產者重寫已經在bean上的其他東西。在這裏你沒有向生產者添加一個範圍,所以它會假設從屬,因爲你沒有在生產者方法中指定。我希望有所幫助。

+0

如果生產者覆蓋了bean所具有的任何範圍,那麼爲什麼當我們在生產者方法參數中注入bean時,我們需要在新的註釋中?三角形bean提到了@ApplicationScoped,而在DrawingTool中注入三角形bean的DrawingTool bean和生產者方法具有默認的相關範圍。所以,我期待Traingle bean範圍(應用程序範圍)將被生產者方法所尊重。如果我想要Trailing bean範圍被覆蓋,我會在方法論中重新提到,我沒有。 – Mayur

+0

你有Bean Triangle,但是它被生產者覆蓋了,所以實際注入的是一個新的依賴的scoped bean。如果你調試你的應用程序,你應該能夠看到這個。 – LightGuard

+0

感謝LightGuard。我現在已經明白了。 – Mayur

相關問題