亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Bean 類中使用 ApplicationContextAware 來初始化原型作用域

在 Bean 類中使用 ApplicationContextAware 來初始化原型作用域

慕容708150 2022-04-28 15:52:03
我正在學習春天,我只是在玩ApplicationContextAwarebean 范圍。我將附上代碼,然后描述我想要做什么。到目前為止,我已經創建了一個點類:public class Point {private int x;private int y;public int getX() {    return x;}public void setX(int x) {    this.x = x;}public int getY() {    return y;}public void setY(int y) {    this.y = y;}@Overridepublic String toString() {    return "x: "+this.x+",y: "+this.y;}}我創建了一個Triangle類,它有這個Point類的 3 個實例:public class Triangle implements ApplicationContextAware, BeanNameAware{private Point pointA;private Point pointB;private Point pointC;private String beanName;private ApplicationContext context=null;public Point getPointA() {    return pointA;}public void setPointA(Point pointA) {    this.pointA = (Point)this.context.getBean("point1");}public Point getPointB() {    return pointB;}public void setPointB(Point pointB) {    this.pointB = (Point)this.context.getBean("point2");}public Point getPointC() {    return pointC;}public void setPointC(Point pointC) {    this.pointC = (Point)this.context.getBean("point3");}public void draw() {    System.out.println("BeanName is: "+this.beanName);    System.out.println(pointA);    System.out.println(pointB);    System.out.println(pointC);}@Overridepublic void setApplicationContext(ApplicationContext arg0) throws BeansException {    this.context = arg0;}@Overridepublic void setBeanName(String arg0) {    this.beanName = arg0;}}
查看完整描述

3 回答

?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

獨立于您面臨的錯誤:讓我們看看您的課程設置:

你希望你的觀點是原型。所以每次你通過注入請求一個新的 Bean 時,Spring 都會給你一個新的實例。

現在您將原型 bean 注入到默認情況下為單例的 Triangle bean 中(這意味著它只被請求和創建一次)。所以原型 bean (Point) 也被請求一次以將它們注入到單例 Triangle bean 中。

從現在開始,您的原型 bean 不再像原型 bean 那樣工作,這意味著它們從您的 Triangle bean 繼承了單例范圍。

但是在這個設置上你很好,但你應該記住這個陷阱:只有當容器/上下文請求 bean 時,Spring 才會創建原型 bean 的新實例。


查看完整回答
反對 回復 2022-04-28
?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

您正在獲得 NPE,因為上下文對象在下面和類似方法中為空


public void setPointC(Point pointC) {

    this.pointC = (Point)this.context.getBean("point3");

}

僅當所有 bean 都已初始化并且上下文對象已準備好時,才會在 ApplicationContextAware bean 中設置上下文對象。


您的代碼應如下所示


public void setPointC(Point pointC) {

        this.pointC = pointC;

    }


查看完整回答
反對 回復 2022-04-28
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

兩個原因導致你的代碼拋出異常:

  • new ClassPathXmlApplicationContext("spring.xml")方法無法意識到類上下文已準備就緒。

  • 循環依賴。創建ApplicationContext需要成功創建所有bean,但Triangle需要一個上下文。

您可以使用 IOC 來解決您的問題。


查看完整回答
反對 回復 2022-04-28
  • 3 回答
  • 0 關注
  • 116 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號