[英]Spring Autowiring calling wrong constructor
我正在學習帶有注釋和自動接線的Springs
。 我嘗試了三種類型的自動接線
這是我的配置
<?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.