java 装配_Spring 通过Java代码装配bean
1. 背景
盡管在很多場景下通過組件掃描和自動裝配實現Spring的自動化掃描配置是更為推薦的方式,但在有些情況下自動化掃描的方案行不通,如想要將第三方庫中的組件裝配到自己的應用中。在這種情況下必須通過顯示 裝配的方式。
顯示裝配有兩種可選方案:Java和XML。JavaConfig是更好的方案:更強大、類型安全并對重構友好。因他就是Java代碼。
2. 代碼 & 解說
接口: CompactDisc.java
packagesoundsystem;public interfaceCompactDisc {voidplay();
}
接口: MediaPlayer.java
packagesoundsystem;public interfaceMediaPlayer {voidplay();
}
SgtPeppers.java
packagesoundsystem;public class SgtPeppers implementsCompactDisc {private String title = "Sgt. Pepper's Lonely Hearts Club Band";private String artist = "The Beatles";
@Overridepublic voidplay() {
System.out.println("Playing " + title + " by " +artist);
}
}
注:區別與自動轉配,這里去掉了@compenent注解
CDPlayer.java
packagesoundsystem;importorg.springframework.beans.factory.annotation.Autowired;public class CDPlayer implementsMediaPlayer {privateCompactDisc cd;
@AutowiredpublicCDPlayer(CompactDisc cd) {this.cd =cd;
}
@Overridepublic voidplay() {
cd.play();
}
}
借助JavaConfig實現注入
CDPlayerConfig.java
packagesoundsystem;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;
@Configurationpublic classCDPlayerConfig {
@BeanpublicCompactDisc compactDisc() {return newSgtPeppers();
}
@BeanpublicCDPlayer cdPlayer(CompactDisc compactDisc) {return newCDPlayer(compactDisc);
}
}
注:區別與自動裝配,這里去掉了@ComponentScan注解,而是顯式的聲明了Bean。@Bean注解告訴了Spring上下文這個方法會將返回一個對象,該對象要注冊為Spring應用上下文中的bean,方法體重包含了最終產生bean實例的實現邏輯。
測試CDPlayerTest.java
packagesoundsystem;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.test.context.ContextConfiguration;importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)public classCDPlayerTest {
@AutowiredprivateMediaPlayer player;
@Testpublic voidplay() {
player.play();
}
}
3. 深入了解JavaConfig
別于上面代碼中的實現方式,還可以這樣配置JavaConfig
packagesoundsystem;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;
@Configurationpublic classCDPlayerConfig {
@BeanpublicCompactDisc sgtPeppers() {return newSgtPeppers();
}
@BeanpublicCDPlayer cdPlayer() {return newCDPlayer(sgtPeppers());
}
}
cdPlayer沒有使用默認的構造函數,而是調用了CompactDisc對象。看起來是通過調用sgtPeppers()得到的,實際不是這樣的。原因是sgtPeppers方法是上添加了@Bean注解,Spring將會攔截所有對它的調用,而是直接返回方法所創建的bean,而不是每次都對其進行實際的調用。以下為證
@BeanpublicCDPlayer() {return newCDPlayer(sgtPeppers());
}
@BeanpublicanotherCDPlayer() {return new CDPlayer(sgtPeppers());
}
假如每次都調用sgtPeppers()方法,那么每個CDPlayer實例將會有一個特有的SgtPepper實例,但實際上是相同的實例。
相比于前面代碼中的聲明方式,還是推薦上述代碼中的方式,那樣更容易理解。如
@BeanpublicCompactDisc compactDisc() {return newSgtPeppers();
}
@BeanpublicCDPlayer cdPlayer(CompactDisc compactDisc) {return newCDPlayer(compactDisc);
}
這種方法不用明確引用@Bean方法也能將CompactDisc注入到CDPlayer的構造器中。這種方式是引用其他bean的最佳方式,它不需要要求將CompactDisc必須在JavaConfig中聲明。
總結
以上是生活随笔為你收集整理的java 装配_Spring 通过Java代码装配bean的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb java spring_
- 下一篇: Leetcode 904.水果成蓝(滑动