簡體   English   中英

Spring Autowiring調用錯誤的構造函數

[英]Spring Autowiring calling wrong constructor

我正在學習帶有注釋和自動接線的Springs 我嘗試了三種類型的自動接線

  1. 建設者
  2. 二傳手注射
  3. 方法

這是我的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- add entry for component scanning -->
    <context:component-scan base-package="com.aht.spring.entity"></context:component-scan>

</beans>

這些是我的實體

教練

package com.aht.spring.entity.coach;

public interface Coach {

    String getDailyWorkOut();

    String getDailyFortune();
}

財富服務

package com.aht.spring.entity.fortune;

public interface FortuneService {

    String getFortune();
}

快樂財富服務

package com.aht.spring.entity.fortune;

import org.springframework.stereotype.Component;

@Component
public class HappyFortuneService implements FortuneService {

    public String getFortune() {
        return "Feel energetic for first half of trainning";
    }
}

足球教練

package com.aht.spring.entity.coach;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.aht.spring.entity.fortune.FortuneService;

@Component
public class FootBallCoach implements Coach {

    private FortuneService fortuneService;

    @Autowired
    public FootBallCoach(FortuneService fortuneService) {
        this.fortuneService = fortuneService;
    }

    public String getDailyWorkOut() {
        return "Practice one-on-one for 2 hours";
    }

    public String getDailyFortune() {
        return fortuneService.getFortune();
    }
}

板球教練

package com.aht.spring.entity.coach;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.aht.spring.entity.fortune.FortuneService;

@Component
public class CricketCoach implements Coach {

    private FortuneService fortuneService;

    public CricketCoach() {
        System.out.println("Default constructor");
    }

    @Autowired
    public void setFortuneService(FortuneService fortuneService) {
        this.fortuneService = fortuneService;
    }

    public String getDailyWorkOut() {
        return "Practice out field tips";
    }

    public String getDailyFortune() {
        return fortuneService.getFortune();
    }
}

棒球教練

package com.aht.spring.entity.coach;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.aht.spring.entity.fortune.FortuneService;

@Component
public class BaseBallCoach implements Coach {

    private FortuneService fortuneService;

    public String getDailyWorkOut() {
        return "Practice curve whole day";
    }

    public String getDailyFortune() {
        return fortuneService.getFortune();
    }

    @Autowired
    public void customAutoWire(FortuneService fortuneService) {
        this.fortuneService = fortuneService;
    }
}

我有三個用於執行三種自動接線方式的類,Constructor和Setter可以正常工作,但是當method明智的自動接線完成時,就會調用錯誤的構造函數。 我在BaseBallCoach類中錯過的一件事是默認構造函數,但是無論如何,編譯器會為我自動生成一個嗎?

這是我的CoachMethodInjectionApp.java ,在其中執行方法自動接線

package com.aht.spring.app;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.aht.spring.entity.coach.Coach;

public class CoachMethodInjectionApp {

    public static void main(String[] args) {

        //  read config-file
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        //  get beans
        Coach coach = context.getBean("baseBallCoach", Coach.class);

        //  get dependencies
        System.out.println(coach.getDailyFortune());

        //  get daily workout
        System.out.println(coach.getDailyWorkOut());

        //  close context
        context.close();
    }
}

這是輸出

Default constructor
Feel energetic for first half of trainning
Practice curve whole day

輸出的第一行是我不了解的Default constructor ,為什么CricketCoach的構造CricketCoach執行?

由於CricketCoach類使用@Component注釋,並且在Spring容器啟動時掃描包, CricketCoach通過調用no-arg構造函數來創建CricketCoach類型的實例。

所有在XML文件中定義或注釋的豆@Component或任何擴展@Component從掃描包將在Spring容器的開始時間或創建不管他們會不會用

您將在此處創建Coach類的新實例: Coach coach = context.getBean("baseBallCoach", Coach.class); 每次創建新實例時,它都會執行一個構造函數。 在其中調用System.out.println("Default constructor"); 您可以嘗試從板球教練訓練中刪除@Component。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM