摘要:構(gòu)造函數(shù)方法進(jìn)行依賴注入注入的效率最高新建方法電源供電中。。。。。無參數(shù)構(gòu)造函數(shù)選創(chuàng)建有參的構(gòu)造函數(shù)有參數(shù)構(gòu)造函數(shù)多參數(shù)構(gòu)造函數(shù)。。。。
一、Spring基礎(chǔ) 1.Spring簡介 1.1 核心概念
序號(hào) | 概念 | 全稱 | 具體內(nèi)容 |
---|---|---|---|
1 | IoC | Inversion of Control (控制反轉(zhuǎn)) | 對(duì)象創(chuàng)建和對(duì)象關(guān)系管理權(quán)限,由開發(fā)者轉(zhuǎn)為spring |
2 | DI | Dependency Injection(依賴注入) | 對(duì)象的依賴關(guān)系的創(chuàng)建過程 |
3 | AOP | Aspect Oriented Programming(面向切面編程) |
功能模塊組成:
模塊 | 功能 | 備注 |
---|---|---|
Core | IoC,DI 功能實(shí)現(xiàn)最基本實(shí)現(xiàn) | 核心模塊 |
Beans | Bean工廠(創(chuàng)建對(duì)象的工廠) | 核心模塊 |
Context | IoC容器,上下文 | 核心模塊 |
SpEL | spring 表達(dá)式語言 | 核心模塊 |
JDBC | JDBC封裝 | 數(shù)據(jù)訪問集成模塊 |
ORM | 數(shù)據(jù)集成框架封裝,jpa jdo | 數(shù)據(jù)訪問集成模塊 |
OXM | 實(shí)現(xiàn)對(duì)象和xml轉(zhuǎn)換 | 數(shù)據(jù)訪問集成模塊 |
JMS | 生產(chǎn)消費(fèi)實(shí)現(xiàn) | 數(shù)據(jù)訪問集成模塊 |
Transactions | 事務(wù)管理 | 數(shù)據(jù)訪問集成模塊 |
web | web監(jiān)聽,初始化ioc容器,上傳等 | web模塊 |
webSocket | webSocket開發(fā) | web模塊 |
Servlet | spring MVC | web模塊 |
Portlet | 內(nèi)容集成 聚合 | web模塊 |
AOP | AOP相關(guān) | |
Aspects | Aspects面向切面編程 | |
Instrumentation | 設(shè)備相關(guān) | |
Messaging | 消息相關(guān) | |
Test | 測(cè)試模塊 |
spring 包含spring MVC
1.2 相關(guān)參數(shù)解析名稱 | 用途 | 備注 | 類型 |
---|---|---|---|
private | 聲明成員變量 | ||
有參的構(gòu)造函數(shù) | 關(guān)聯(lián)成員變量和無參構(gòu)造函數(shù)的關(guān)系 | ||
public void play() | 構(gòu)造一個(gè)方法play,執(zhí)行具體邏輯 | ||
@Autowired | 自動(dòng)滿足bean之間的依賴 | 自動(dòng)裝配,自動(dòng)注入注解 | 定義組件 |
@Transactional | @Transactional 可以作用于接口、接口方法、類以及類方法上。當(dāng)作用于類上時(shí),該類的所有 public 方法將都具有該類型的事務(wù)屬性,同時(shí),我們也可以在方法級(jí)別使用該標(biāo)注來覆蓋類級(jí)別的定義。 但是 Spring 建議不要在接口或者接口方法上使用該注解,因?yàn)檫@只有在使用基于接口的代理時(shí)它才會(huì)生效。另外, @Transactional 注解應(yīng)該只被應(yīng)用到 public 方法上 | 事務(wù)管理 | |
@Component | 表示這個(gè)累需要在應(yīng)用程序中被創(chuàng)建,被掃描 | 被spring上下文發(fā)現(xiàn),自動(dòng)發(fā)現(xiàn)注解 | 定義組件 |
@ComponentScanTransactional | 自動(dòng)發(fā)現(xiàn)應(yīng)用程序中創(chuàng)建的類 | 自動(dòng)掃描Component類 | 定義配置 |
@Configuration | 表示當(dāng)前類是一個(gè)配置類 | 標(biāo)注類為配置類 | 定義配置 |
@Test | 表示當(dāng)前類是一個(gè)測(cè)試類 | ||
@RunWith(SpringJUnit4ClassRunner.class) | 引入Spring單元測(cè)試模塊 | 聲明使用SpringJUnit4ClassRunner.class 測(cè)試單元 | spring測(cè)試環(huán)境 |
@ContextConfiguration(classes = AppConfig.class) | 加載配置類 | spring測(cè)試環(huán)境 | |
@Primary | 首選bean | 設(shè)置實(shí)現(xiàn)類的首選 | 自動(dòng)裝配歧義性 |
@Qualifier | 給bean做注解 | 調(diào)用的時(shí)候可以通過注解區(qū)分實(shí)現(xiàn)類 | 自動(dòng)裝配歧義性 |
@Resource | @Resource 相當(dāng)于@Autowired + @Qualifier("userServiceNormal") | java標(biāo)準(zhǔn) | 自動(dòng)裝配歧義性 |
@Repository | 標(biāo)注數(shù)據(jù)dao實(shí)現(xiàn)類 | 本質(zhì)和@Component沒有區(qū)別,只是更加明確 | 分層架構(gòu)中定義組件 |
@Service | 標(biāo)注Service實(shí)現(xiàn)類 | 本質(zhì)和@Component沒有區(qū)別,只是更加明確 | 分層架構(gòu)中定義組件 |
@Controller | 標(biāo)注web、controller實(shí)現(xiàn)類, API接口 | 本質(zhì)和@Component沒有區(qū)別,只是更加明確 | 分層架構(gòu)中定義組件 |
@Bean | 當(dāng)前配置類為默認(rèn)配置類,自動(dòng)調(diào)用 | ||
@Override | 重寫,重載 | 自雷重寫父類的方法 | |
@RequestMapping | 是一個(gè)用來處理請(qǐng)求地址映射的注解,可用于類或方法上。用于類上,表示類中的所有響應(yīng)請(qǐng)求的方法都是以該地址作為父路徑。 | 配置url映射 | |
@RestController | 是@ResponseBody和@Controller的組合注解 | ||
Extends-繼承類 | 全盤繼承 | 在類的聲明中,通過關(guān)鍵字extends來創(chuàng)建一個(gè)類的子類。 | 對(duì)于class而言,Extends用于(單)繼承一個(gè)類(class) |
implements-實(shí)現(xiàn)接口 | 給這個(gè)類附加額外的功能 | 實(shí)現(xiàn)接口就是在接口中定義了方法,這個(gè)方法要你自己去實(shí)現(xiàn),接口可以看作一個(gè)標(biāo)準(zhǔn),比如定義了一個(gè)動(dòng)物的接口,它里面有吃(eat())這個(gè)方法,你就可以實(shí)現(xiàn)這個(gè)方法implements,這個(gè)方法是自己寫,可以是吃蘋果,吃梨子,香蕉,或者其他的。implements就是具體實(shí)現(xiàn)這個(gè)接口 | implements用于實(shí)現(xiàn)一個(gè)接口(interface) |
DAO | DAO是傳統(tǒng)MVC中Model的關(guān)鍵角色,全稱是Data Access Object。DAO直接負(fù)責(zé)數(shù)據(jù)庫的存取工作,乍一看兩者非常類似,但從架構(gòu)設(shè)計(jì)上講兩者有著本質(zhì)的區(qū)別: | DAO則沒有擺脫數(shù)據(jù)的影子,仍然停留在數(shù)據(jù)操作的層面上,DAO則是相對(duì)數(shù)據(jù)庫而言 | |
Repository | Repository蘊(yùn)含著真正的OO概念,即一個(gè)數(shù)據(jù)倉庫角色,負(fù)責(zé)所有對(duì)象的持久化管理。 | Repository是相對(duì)對(duì)象而言, | https://segmentfault.com/a/11... |
接口:
接口一般是只有方法聲明沒有定義的。
接口可以比作協(xié)議,比如我說一個(gè)協(xié)議是“殺人”那么這個(gè)接口你可以用 砍刀去實(shí)現(xiàn),至于怎么殺砍刀可以去實(shí)現(xiàn),當(dāng)然你也可以用搶來實(shí)現(xiàn)殺人接口,但是你不能用殺人接口去殺人,因?yàn)闅⑷私涌谥徊贿^是個(gè)功能說明,是個(gè)協(xié)議,具體怎么干,還要看他的實(shí)現(xiàn)類。那么一個(gè)包里面如果有接口,你可以不實(shí)現(xiàn)。這個(gè)不影響你使用其他類。
1.3 for 循環(huán)this.tracks.for + Enter 可以快速得到for循環(huán)
for (String track : this.tracks) { System.out.println("音樂:" + track); }2.Component對(duì)象
2.1 創(chuàng)建maven項(xiàng)目
2.2 創(chuàng)建基礎(chǔ)目錄
2.3 配置pom.xml
4.0.0 com.xfedu spring01 1.0-SNAPSHOT org.springframework spring-context 4.3.13.RELEASE
2.4 編寫純java版本代碼
編寫MessagesService
package hello; public class MessagesService { /** * 執(zhí)行打印功能 * @return返回要打印的字符串 */ public String getMessage(){ return "hello world!"; } }
編寫MessagePrinter
package hello; public class MessagePrinter { /** * private 建立MessagePrinter 和 MessagesService 關(guān)聯(lián)關(guān)系 */ private MessagesService service; /** * service setter 方法 選擇service 按住alt+insert 選擇setter * 設(shè)置service的值 * @param service */ public void setService(MessagesService service) { this.service = service; } public void printMessage(){ System.out.println(this.service.getMessage()); } }
編寫Application
package hello; /** * 創(chuàng)建Application來調(diào)用MessagePrinter類 */ public class Application { public static void main(String[] args) { System.out.println("application"); //創(chuàng)建打印機(jī)對(duì)象 MessagePrinter printer = new MessagePrinter(); //創(chuàng)建消息服務(wù)對(duì)象 MessagesService service = new MessagesService(); //設(shè)置打印機(jī)的service屬性 printer.setService(service); //打印消息 printer.printMessage(); } }
2.5 編寫spring 框架版本代碼
編寫MessagesService
package hello; import org.springframework.stereotype.Component; /** * @Component通知spring容器, * 應(yīng)用程序的對(duì)象(MessagesService)未來會(huì)通過spring容器自動(dòng)創(chuàng)建出來 * 不需要程序員通過new關(guān)鍵字來創(chuàng)建 */ @Component public class MessagesService { /** * ctrl+o 創(chuàng)建無參構(gòu)造的方法(object) * */ public MessagesService() { super(); System.out.println("MessageServer...."); } /** * 執(zhí)行打印功能 * @return返回要打印的字符串 */ public String getMessage(){ return "hello world!"; } }
編寫MessagePrinter
package hello; import org.springframework.stereotype.Component; /** * @Component通知spring容器, * 應(yīng)用程序的對(duì)象(MessagePrinter)未來會(huì)通過spring容器自動(dòng)創(chuàng)建出來 * 不需要程序員通過new關(guān)鍵字來創(chuàng)建 */ @Component public class MessagePrinter { /** * ctrl+o 創(chuàng)建無參構(gòu)造的方法(object) * */ public MessagePrinter() { super(); System.out.println("MessagePrinter"); } /** * private 建立MessagePrinter 和 MessagesService 關(guān)聯(lián)關(guān)系 */ private MessagesService service; /** * service setter 方法 選擇service 按住alt+insert 選擇setter * 設(shè)置service的值 * @param service */ public void setService(MessagesService service) { this.service = service; } public void printMessage(){ System.out.println(this.service.getMessage()); } }
編寫ApplicationSpring
package hello; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; /** * 創(chuàng)建Application來調(diào)用MessagePrinter類 * @ComponentScan 掃描@Component注解的類 */ @ComponentScan public class ApplicationSpring { public static void main(String[] args) { System.out.println("application"); // // //創(chuàng)建打印機(jī)對(duì)象 // MessagePrinter printer = new MessagePrinter(); // //創(chuàng)建消息服務(wù)對(duì)象 // MessagesService service = new MessagesService(); // //設(shè)置打印機(jī)的service屬性 // printer.setService(service); // // //打印消息 // printer.printMessage(); //初始化Spring容器 ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationSpring.class); } }
優(yōu)點(diǎn):通過 * @ComponentScan 掃描@Component注解的類,創(chuàng)建對(duì)象的時(shí)候就可以不用重新new
3.對(duì)象裝配注入Bean 3.1 Bena裝配(注入)的三種方式 3.1.1 隱式的bean發(fā)現(xiàn)機(jī)制和自動(dòng)裝配(主流)package hello; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; /** * 創(chuàng)建Application來調(diào)用MessagePrinter類 * @ComponentScan 掃描@Component注解的類 */ @ComponentScan public class ApplicationSpring { public static void main(String[] args) { System.out.println("application"); // // //創(chuàng)建打印機(jī)對(duì)象 // MessagePrinter printer = new MessagePrinter(); // //創(chuàng)建消息服務(wù)對(duì)象 // MessagesService service = new MessagesService(); // //設(shè)置打印機(jī)的service屬性 // printer.setService(service); // // //打印消息 // printer.printMessage(); //初始化Spring容器 ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationSpring.class); //從容器中獲取MessagePrinter對(duì)象 MessagePrinter printer = context.getBean(MessagePrinter.class); //從容器中獲取MessagesService對(duì)象 MessagesService service = context.getBean(MessagesService.class); System.out.println(printer); System.out.println(service); //設(shè)置打印機(jī)的service屬性,printer和service 建立關(guān)聯(lián)關(guān)系 printer.setService(service); //打印消息調(diào)用printMessage打印 printer.printMessage(); } }
從Context中獲取class
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationSpring.class);
如何在對(duì)象中獲取對(duì)象
//從容器中獲取MessagePrinter對(duì)象,使用context.getBean方法 MessagePrinter printer = context.getBean(MessagePrinter.class);
如何建立對(duì)象的關(guān)聯(lián)關(guān)系
//設(shè)置打印機(jī)的service屬性,printer和service 建立關(guān)聯(lián)關(guān)系 printer.setService(service);
1.定義CompactDisc類,
內(nèi)置CompactDisc無參構(gòu)造函數(shù)
paly方法
用@Component包裝
2.定義CDPlayer
內(nèi)置CDPlayer無參數(shù)構(gòu)造函數(shù)
聲明CompactDisc
構(gòu)建有參構(gòu)造函數(shù)關(guān)聯(lián)CDPlayer和CompactDisc,利用@Autowired進(jìn)行關(guān)聯(lián)自動(dòng)管理
定義play方法
3.定義執(zhí)行main函數(shù)
先通過AnnotationConfigApplicationContext 查出類
執(zhí)行paly方法
利用@ComponentScan包裝,進(jìn)行自動(dòng)組件掃描
4.解耦組件掃描和主類
將注解和主類解耦,多帶帶新建配置類AppConfig
CompactDisc
package soundsystem; import org.springframework.stereotype.Component; @Component public class CompactDisc { public CompactDisc() { super(); System.out.println("CompactDisc無參構(gòu)造函數(shù)"); } public void play(){ System.out.println("正在播放音樂......"); } }
CDPlayer
package soundsystem; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * Component 讓他能被spring上下文發(fā)現(xiàn) */ @Component public class CDPlayer { /** *private 成員變量 */ private CompactDisc cd; public CDPlayer() { super(); System.out.println("CDPlayer無參數(shù)構(gòu)造函數(shù)"); } /** * Ctrl + Insert 選(Constructor)創(chuàng)建有參的構(gòu)造函數(shù) * @param */ @Autowired public CDPlayer(CompactDisc cd) { this.cd = cd; System.out.println("CDPlayer有參數(shù)構(gòu)造函數(shù)"); } /** * 定義一個(gè)方法play,執(zhí)行cd.play()播放工作 */ public void play(){ cd.play(); } }
App
package soundsystem; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; @ComponentScan public class App { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(App.class); CDPlayer player = context.getBean(CDPlayer.class); player.play(); } }
將注解和主類解耦,多帶帶新建配置類AppConfig
AppConfig
這里就配置類掃描@ComponentScan 和@Configuration 注解
package soundsystem; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /** * 這就是一個(gè)配置類 */ @Configuration @ComponentScan public class AppConfig { public AppConfig() { super(); System.out.println("配置類,用于將注解和主類解耦"); } }
App
這里就將@ComponentScan注解取消了
package soundsystem; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class App { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); CDPlayer player = context.getBean(CDPlayer.class); player.play(); } }3.1.2 在XML進(jìn)行顯示
applicationContext.xml
MessagePrinter
package hello; /** * @Component通知spring容器, * 應(yīng)用程序的對(duì)象(MessagePrinter)未來會(huì)通過spring容器自動(dòng)創(chuàng)建出來 * 不需要程序員通過new關(guān)鍵字來創(chuàng)建 */ public class MessagePrinter { /** * ctrl+o 創(chuàng)建無參構(gòu)造的方法(object) * */ public MessagePrinter() { super(); System.out.println("MessagePrinter"); } /** * private 建立MessagePrinter 和 MessagesService 關(guān)聯(lián)關(guān)系 */ private MessagesService service; /** * service setter 方法 選擇service 按住alt+insert 選擇setter * 設(shè)置service的值 * @param service */ public void setService(MessagesService service) { this.service = service; } public void printMessage(){ System.out.println(this.service.getMessage()); } }
MessagesService
package hello; /** * @Component通知spring容器, * 應(yīng)用程序的對(duì)象(MessagesService)未來會(huì)通過spring容器自動(dòng)創(chuàng)建出來 * 不需要程序員通過new關(guān)鍵字來創(chuàng)建 */ public class MessagesService { /** * ctrl+o 創(chuàng)建無參構(gòu)造的方法(object) * */ public MessagesService() { super(); System.out.println("MessageServer...."); } /** * 執(zhí)行打印功能 * @return返回要打印的字符串 */ public String getMessage(){ return "hello world!"; } }
ApplicationSpring
package hello; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 創(chuàng)建Application來調(diào)用MessagePrinter類 * @ComponentScan 掃描@Component注解的類 */ public class ApplicationSpring { public static void main(String[] args) { System.out.println("application"); //初始化Spring容器 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //從容器中獲取MessagePrinter對(duì)象 MessagePrinter printer = context.getBean(MessagePrinter.class); //打印消息調(diào)用printMessage打印 printer.printMessage(); } }
聲明使用xml文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
3.1.3 在java中進(jìn)行顯示 3.2 Autowired 使用場(chǎng)景用于管理對(duì)象之間的關(guān)聯(lián)關(guān)系
3.2.1 簡單的依賴注入例子MessagePrinter
package hello; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * @Component通知spring容器, * 應(yīng)用程序的對(duì)象(MessagePrinter)未來會(huì)通過spring容器自動(dòng)創(chuàng)建出來 * 不需要程序員通過new關(guān)鍵字來創(chuàng)建 */ @Component public class MessagePrinter { /** * ctrl+o 創(chuàng)建無參構(gòu)造的方法(object) * */ public MessagePrinter() { super(); System.out.println("MessagePrinter"); } /** * private 建立MessagePrinter 和 MessagesService 關(guān)聯(lián)關(guān)系 */ private MessagesService service; /** * service setter 方法 選擇service 按住alt+insert 選擇setter * 設(shè)置service的值 * @param service * @Autowired 用于spring管理對(duì)象之間的關(guān)聯(lián)關(guān)系 */ @Autowired public void setService(MessagesService service) { this.service = service; } public void printMessage(){ System.out.println(this.service.getMessage()); } }
ApplicationSpring
package hello; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; /** * 創(chuàng)建Application來調(diào)用MessagePrinter類 * @ComponentScan 掃描@Component注解的類 */ @ComponentScan public class ApplicationSpring { public static void main(String[] args) { System.out.println("application"); // // //創(chuàng)建打印機(jī)對(duì)象 // MessagePrinter printer = new MessagePrinter(); // //創(chuàng)建消息服務(wù)對(duì)象 // MessagesService service = new MessagesService(); // //設(shè)置打印機(jī)的service屬性 // printer.setService(service); // // //打印消息 // printer.printMessage(); //初始化Spring容器 ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationSpring.class); //從容器中獲取MessagePrinter對(duì)象 MessagePrinter printer = context.getBean(MessagePrinter.class); //從容器中獲取MessagesService對(duì)象 //MessagesService service = context.getBean(MessagesService.class); //System.out.println(printer); //System.out.println(service); //設(shè)置打印機(jī)的service屬性,printer和service 建立關(guān)聯(lián)關(guān)系 //printer.setService(service); //打印消息調(diào)用printMessage打印 printer.printMessage(); } }
注解:使用@Autowired管理對(duì)象之間的關(guān)聯(lián)關(guān)系,這樣就可以自動(dòng)處理關(guān)聯(lián)關(guān)系。
3.2.2 構(gòu)造函數(shù)方法進(jìn)行依賴注入注入的效率最高
Power 新建power方法
package soundsystem; import org.springframework.stereotype.Component; @Component public class Power { public Power() { super(); } public void supply(){ System.out.println("電源供電中。。。。。"); } }
CDPlayer 增加power注入
package soundsystem; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * Component 讓他能被spring上下文發(fā)現(xiàn) */ @Component public class CDPlayer { /** *private 成員變量 */ private CompactDisc cd; private Power power; public CDPlayer() { super(); System.out.println("CDPlayer無參數(shù)構(gòu)造函數(shù)"); } /** * Ctrl + Insert 選(Constructor)創(chuàng)建有參的構(gòu)造函數(shù) * @param */ // @Autowired // public CDPlayer(CompactDisc cd, Power power) { // this.cd = cd; // this.power = power; // System.out.println("CDPlayer多參數(shù)構(gòu)造函數(shù)"); // } @Autowired public CDPlayer(CompactDisc cd, Power power) { this.cd = cd; this.power = power; System.out.println("CDPlayer多參數(shù)構(gòu)造函數(shù)。。。。"); } /** * 定義一個(gè)方法play,執(zhí)行cd.play() power.supply();播放工作 */ public void play(){ power.supply(); cd.play(); } }
CompactDisc 無修改
package soundsystem; import org.springframework.stereotype.Component; @Component public class CompactDisc { public CompactDisc() { super(); System.out.println("CompactDisc無參構(gòu)造函數(shù)"); } public void play(){ System.out.println("正在播放音樂......"); } }
AppConfig 無修改
package soundsystem; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /** * 這就是一個(gè)配置類 */ @Configuration @ComponentScan public class AppConfig { public AppConfig() { super(); System.out.println("配置類,用于將注解和主類解耦"); } }
AppTest 無修改
package soundsystem; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = AppConfig.class) public class AppTest { @Autowired private CDPlayer player; @Test public void testPlay(){ player.play(); } }3.2.3 用成員變量的方式進(jìn)行依賴注入
這個(gè)方式就是spring通過反射機(jī)制做的依賴注入
注入效率低,但是簡潔
package soundsystem; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * Component 讓他能被spring上下文發(fā)現(xiàn) */ @Component public class CDPlayer { /** *private 成員變量 */ @Autowired private CompactDisc cd; @Autowired private Power power; public CDPlayer() { super(); System.out.println("CDPlayer無參數(shù)構(gòu)造函數(shù)"); } /** * Ctrl + Insert 選(Constructor)創(chuàng)建有參的構(gòu)造函數(shù) * @param */ // @Autowired // public CDPlayer(CompactDisc cd) { // this.cd = cd; // System.out.println("CDPlayer有參數(shù)構(gòu)造函數(shù)"); // } // @Autowired // public CDPlayer(CompactDisc cd, Power power) { // this.cd = cd; // this.power = power; // System.out.println("CDPlayer多參數(shù)構(gòu)造函數(shù)。。。。"); // } /** * 定義一個(gè)方法play,執(zhí)行cd.play()播放工作 */ public void play(){ power.supply(); cd.play(); } }3.2.3 利用setter方法進(jìn)行依賴注入
Alt+Insert 選setter進(jìn)行setter對(duì)對(duì)象方法進(jìn)行裝配
package soundsystem; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * Component 讓他能被spring上下文發(fā)現(xiàn) */ @Component public class CDPlayer { /** *private 成員變量 */ //@Autowired private CompactDisc cd; //@Autowired private Power power; @Autowired public void setCd(CompactDisc cd) { this.cd = cd; System.out.println("調(diào)用setCd。。。。"); } @Autowired public void setPower(Power power) { this.power = power; System.out.println("調(diào)用setPower。。。"); } public CDPlayer() { super(); System.out.println("CDPlayer無參數(shù)構(gòu)造函數(shù)"); } /** * Ctrl + Insert 選(Constructor)創(chuàng)建有參的構(gòu)造函數(shù) * @param */ // @Autowired // public CDPlayer(CompactDisc cd) { // this.cd = cd; // System.out.println("CDPlayer有參數(shù)構(gòu)造函數(shù)"); // } // @Autowired // public CDPlayer(CompactDisc cd, Power power) { // this.cd = cd; // this.power = power; // System.out.println("CDPlayer多參數(shù)構(gòu)造函數(shù)。。。。"); // } /** * 定義一個(gè)方法play,執(zhí)行cd.play()播放工作 */ public void play(){ power.supply(); cd.play(); } }3.2.4 用在任意方法上
package soundsystem; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * Component 讓他能被spring上下文發(fā)現(xiàn) */ @Component public class CDPlayer { /** *private 成員變量 */ //@Autowired private CompactDisc cd; //@Autowired private Power power; // @Autowired // public void setCd(CompactDisc cd) { // this.cd = cd; // System.out.println("調(diào)用setCd。。。。"); // } // // @Autowired // public void setPower(Power power) { // this.power = power; // System.out.println("調(diào)用setPower。。。"); // } @Autowired public void prepare(CompactDisc cd ,Power power){ this.cd = cd; this.power = power; System.out.println("調(diào)用prepare。。。"); } public CDPlayer() { super(); System.out.println("CDPlayer無參數(shù)構(gòu)造函數(shù)"); } /** * Ctrl + Insert 選(Constructor)創(chuàng)建有參的構(gòu)造函數(shù) * @param */ // @Autowired // public CDPlayer(CompactDisc cd) { // this.cd = cd; // System.out.println("CDPlayer有參數(shù)構(gòu)造函數(shù)"); // } // @Autowired // public CDPlayer(CompactDisc cd, Power power) { // this.cd = cd; // this.power = power; // System.out.println("CDPlayer多參數(shù)構(gòu)造函數(shù)。。。。"); // } /** * 定義一個(gè)方法play,執(zhí)行cd.play()播放工作 */ public void play(){ power.supply(); cd.play(); } }4.接口開發(fā) interface 4.1 簡單的接口實(shí)現(xiàn),單一實(shí)現(xiàn)類環(huán)境
創(chuàng)建com.cloud.demo.service 包
創(chuàng)建UserService 接口
package com.cloud.demo.service; /**
*/
public interface UserService {
void add();
}
- 創(chuàng)建接口實(shí)現(xiàn)方法(實(shí)現(xiàn)類),創(chuàng)建包c(diǎn)om.cloud.demo.service.com.cloud.demo.service.impl,創(chuàng)建實(shí)現(xiàn)類UserServiceNormal
package com.cloud.demo.service.com.cloud.demo.service.impl;
import com.cloud.demo.service.UserService;
import org.springframework.stereotype.Component;
/**
UserServiceNormal 實(shí)現(xiàn)UserService 的方法
這里為實(shí)現(xiàn)類,@Component不寫在接口,寫在實(shí)現(xiàn)類上
*/
@Component
public class UserServiceNormal implements UserService {
public void add() { System.out.println("添加用戶"); }
}
- 創(chuàng)建配置類AppConfig
package com.cloud.demo.service;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class AppConfig {
}
- 創(chuàng)建單元測(cè)試,新建包c(diǎn)om.cloud.demo.service,userService的接口UserServiceTest
package com.cloud.demo.service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
1.要測(cè)試的是userService的接口
2.private UserService userService; 接口注入@Autowired
3.userService.add() 調(diào)用add()方法
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class UserServiceTest {
//單一實(shí)現(xiàn)類環(huán)境下 @Autowired private UserService userService; @Test public void testAdd(){ userService.add(); }
}
***@Component不寫在接口,寫在實(shí)現(xiàn)類上*** ***調(diào)用userService,需要聲明接口 private UserService userService;*** ### 4.2 多實(shí)現(xiàn)類環(huán)境 #### 4.2.1 設(shè)置首選Bean - 配置@Primary,這樣系統(tǒng)默認(rèn)就會(huì)使用UserServiceNormal實(shí)現(xiàn)類,但是有局限性 - 只能定義一個(gè)@Primary
@Component
@Primary
public class UserServiceNormal implements UserService {
public void add() { System.out.println("增加用戶"); } public void del() { System.out.println("刪除用戶"); }
}
#### 4.2.2 使用限定符@Qualifier UserServiceFestival
@Component
@Qualifier("Festival")
public class UserServiceFestival implements UserService {
@Override public void add() { System.out.println("注冊(cè)用戶并發(fā)送優(yōu)惠券"); } @Override public void del() { }
}
UserServiceNormal
@Component
@Qualifier("Normal")
public class UserServiceNormal implements UserService {
public void add() { System.out.println("增加用戶"); } public void del() { System.out.println("刪除用戶"); }
}
UserServiceTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class UserServiceTest {
@Autowired //這里通過@Qualifier 調(diào)用Festival 實(shí)現(xiàn)類 @Qualifier("Festival") private UserService userService; @Test public void testAdd(){ userService.add(); userService.del(); }
}
#### 4.2.3 通過設(shè)置ID和限定符實(shí)現(xiàn) - 將參數(shù)配置在@Component中實(shí)現(xiàn)@Qualifier UserServiceFestival
@Component("fastival")
public class UserServiceFestival implements UserService {
@Override public void add() { System.out.println("注冊(cè)用戶并發(fā)送優(yōu)惠券"); } @Override public void del() { }
}
UserServiceNormal
@Component("normal")
public class UserServiceNormal implements UserService {
public void add() { System.out.println("增加用戶"); } public void del() { System.out.println("刪除用戶"); }
}
UserServiceTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class UserServiceTest {
@Autowired @Qualifier("fastival") private UserService userService; @Test public void testAdd(){ userService.add(); userService.del(); }
}
#### 4.2.4 使用系統(tǒng)默認(rèn)ID和限定符 - spring中默認(rèn)會(huì)給實(shí)現(xiàn)類分配一個(gè)ID ,為類名首寫字母小寫 UserServiceTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class UserServiceTest {
@Autowired @Qualifier("userServiceNormal") private UserService userService; @Test public void testAdd(){ userService.add(); userService.del(); }
}
#### 4.2.5 使用@Resource - @Resource 相當(dāng)于@Autowired + @Qualifier("userServiceNormal") - @Resource是jdk標(biāo)準(zhǔn)類,非spring標(biāo)準(zhǔn)類
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class UserServiceTest {
//@Autowired //@Qualifier("userServiceNormal") @Resource(name="userServiceNormal") private UserService userService; @Test public void testAdd(){ userService.add(); userService.del(); }
}
## 5.配置類 ComponentScan組件掃描 ### 5.1 直接聲明 直接聲明單個(gè)目錄
@Configuration
@ComponentScan("com.cloud.demo")
直接聲明多個(gè)目錄
@Configuration
@ComponentScan(basePackages = {"com.cloud.demo.web","com.cloud.demo.service","com.cloud.demo.dao"})
- 有風(fēng)險(xiǎn)重構(gòu)不會(huì)自動(dòng)修改 直接聲明接口類
@Configuration
@ComponentScan(basePackageClasses = {UserController.class, UserService.class, UserDao.class})
### 5.2 XML聲明 ***applicationContext.xml 相當(dāng)于@Configuration*** applicationContext.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
***測(cè)試用列中修改UserControllerTest*** @ContextConfiguration("classpath:applicationContext.xml") 指定xml位置
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(classes = AppConfig.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UserControllerTest {
@Autowired private UserController userController; @Test public void testAdd(){ userController.add(); }
}
## 6 配置Java Configuration ### 6.1 如何配置@bean對(duì)象在java Config 接口:UserDao
public interface UserDao {
void add();
}
接口實(shí)現(xiàn)類:UserDaoNormal
public class UserDaoNormal implements UserDao {
@Override public void add() { System.out.println("添加用戶到數(shù)據(jù)庫中。。。。"); }
}
配置類:AppConfig - @Configuration 聲明為配置類 - @Bean標(biāo)識(shí)spring默認(rèn)啟動(dòng)會(huì)自動(dòng)加載改配置
@Configuration
public class AppConfig {
@Bean public UserDao UserDaoNormal(){ System.out.println("創(chuàng)建UserDao對(duì)象"); return new UserDaoNormal(); }
}
測(cè)試類:UserDaoTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class UserDaoTest {
@Autowired private UserDao userDao; @Test public void testAdd(){ userDao.add(); }
}
### 6.2 構(gòu)造函數(shù)注入場(chǎng)景- 普通方式 UserServiceNormal - 通過構(gòu)造函數(shù)關(guān)聯(lián)依賴
public class UserServiceNormal implements UserService {
private UserDao userDao; //無參構(gòu)造函數(shù) public UserServiceNormal() { super(); } //有參構(gòu)造函數(shù) public UserServiceNormal(UserDao userDao) { this.userDao = userDao; } @Override public void add() { userDao.add(); }
}
UserService
public interface UserService {
void add();
}
UserDao
public interface UserDao {
void add();
}
UserDaoNormal
public class UserDaoNormal implements UserDao {
@Override public void add() { System.out.println("添加用戶到數(shù)據(jù)庫中。。。。"); }
}
AppConfig
@Configuration
public class AppConfig {
@Bean public UserDao userDaoNormal(){ System.out.println("創(chuàng)建UserDao對(duì)象"); return new UserDaoNormal(); } @Bean public UserService userServiceNormal(){ System.out.println("創(chuàng)建UserService對(duì)象"); UserDao userDao = userDaoNormal(); return new UserServiceNormal(userDao); }
}
UserServiceTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class UserServiceTest {
@Autowired private UserService userService; @Test public void testAdd(){ userService.add(); }
}
### 6.3 構(gòu)造函數(shù)注入場(chǎng)景- 優(yōu)雅方式 AppConfig
@Configuration
public class AppConfig {
@Bean public UserDao userDaoNormal(){ System.out.println("創(chuàng)建UserDao對(duì)象"); return new UserDaoNormal(); } @Bean public UserService userServiceNormal(UserDao userDao){ System.out.println("創(chuàng)建UserService對(duì)象"); //UserDao userDao = userDaoNormal(); return new UserServiceNormal(userDao); }
}
- 實(shí)際編程中不會(huì)做函數(shù)的調(diào)用,而是在參數(shù)中取獲取UserDao ### 6.4 通過setter方法依賴注入 UserServiceNormal
public class UserServiceNormal implements UserService {
private UserDao userDao; //setter方法注入 public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void add() { userDao.add(); }
}
AppConfig
@Configuration
public class AppConfig {
@Bean public UserDao userDaoNormal(){ System.out.println("創(chuàng)建UserDao對(duì)象"); return new UserDaoNormal(); } @Bean public UserService userServiceNormal(UserDao userDao){ System.out.println("創(chuàng)建UserService對(duì)象"); //賦值給一個(gè)變量userService UserServiceNormal userService = new UserServiceNormal(); //調(diào)用userService的setter方法,將userDao注入 userService.setUserDao(userDao); //返回userService return userService; }
}
### 6.5 通過任意函數(shù)注入 UserServiceNormal
public class UserServiceNormal implements UserService {
private UserDao userDao; //任意函數(shù)注入 public void prepare(UserDao userDao){ this.userDao = userDao; } @Override public void add() { userDao.add(); }
}
AppConfig
@Configuration
public class AppConfig {
@Bean public UserDao userDaoNormal(){ System.out.println("創(chuàng)建UserDao對(duì)象"); return new UserDaoNormal(); } @Bean public UserService userServiceNormal(UserDao userDao){ System.out.println("創(chuàng)建UserService對(duì)象"); UserServiceNormal userService = new UserServiceNormal(); //任意函數(shù)注入 userService.prepare(userDao); return userService; }
}
### 6.6 XML裝配 #### 6.6.1 創(chuàng)建xml配置規(guī)范 applicationContext.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
#### 6.6.2 xml定義第bean CompactDisc
public class CompactDisc {
public CompactDisc() { super(); System.out.println("CompacDisc構(gòu)造函數(shù)。。。。" + this.toString()); } public void play(){ System.out.println("播放CD音樂。。。。。" + this.toString()); }
}
ApplicationSpring
public class ApplicationSpring {
public static void main(String[] args) { System.out.println("ApplicationSpring is running......"); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //初始化cd CompactDisc cd = context.getBean(CompactDisc.class); //調(diào)用play方法 cd.play(); }
}
applicationContext.xml - xml 定義bean
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
輸出結(jié)果
ApplicationSpring is running......
CompacDisc構(gòu)造函數(shù)。。。。com.cloud.deam.soundsystem.CompactDisc@2669b199
播放CD音樂。。。。。com.cloud.deam.soundsystem.CompactDisc@2669b199
***多個(gè)重名bean設(shè)置id區(qū)分:***
- name可以通過分號(hào)、空格、逗號(hào)分隔,設(shè)置不同的別名 name="CompactDisc1 CompactDisc12 CompactDisc13 " - id只能通過傳字符進(jìn)行傳遞 ApplicationSpring -- 主方法
public class ApplicationSpring {
public static void main(String[] args) { System.out.println("ApplicationSpring is running......"); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //CompactDisc cd = context.getBean(CompactDisc.class); CompactDisc cd1 = (CompactDisc) context.getBean("compactDisc1"); CompactDisc cd2 = (CompactDisc) context.getBean("compactDisc2"); cd1.play(); cd2.play(); }
}
AppTest -- 測(cè)試類
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class CompactDiscTest {
@Autowired private CompactDisc CompactDisc1; @Autowired private CompactDisc CompactDisc2; //過濾方式注入 @Autowired @Qualifier("CompactDisc2") private CompactDisc cd; @Test public void testPlay(){ CompactDisc1.play(); CompactDisc2.play(); cd.play(); }
}
#### 6.6.3 xml注入 - 通過構(gòu)造函數(shù) | 名稱 | 用途 | 備注 | | --------------------- | ------------------------------------------------------------ | ---- | |元素 | 依賴Bean,有參構(gòu)造函數(shù)依賴注入 | | | c-名稱空間 | --c:c函數(shù)命令空間 :cd 構(gòu)造函數(shù)的參數(shù)名字cd
public CDPlayer(CompactDisc cd),-ref:表示的是CompactDisc2名稱的引用
也可以寫成c:0-ref="CompactDisc2" c:1-ref="CompactDisc2" 表示第一個(gè) 第二個(gè)參數(shù) | | | | | | ***元構(gòu)造函數(shù)依賴注入*** applicationContext.xml
CDPlayerTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class CDPlayerTest {
@Autowired private CDPlayer cdPlayer; @Test public void Test01(){ cdPlayer.play(); }
}
***c-名稱空間依賴注入***
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
CDPlayerTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class CDPlayerTest {
@Autowired private CDPlayer cdPlayer1; @Autowired private CDPlayer cdPlayer2; @Test public void Test01(){ cdPlayer1.play(); cdPlayer2.play(); }
}
#### 6.6.4 注入簡單類型 -通過構(gòu)造函數(shù) - 給CompactDisc1 對(duì)象注入title、artist
***-c方式注入簡單類型:***
CompactDisc
public class CompactDisc {
private String title; private String artist; public CompactDisc() { super(); System.out.println("CompacDisc構(gòu)造函數(shù)。。。。" + this.toString()); } public CompactDisc(String title, String artist) { this.title = title; this.artist = artist; System.out.println("CompacDisc構(gòu)造函數(shù)。。。。" + this.toString()); } public void play(){ System.out.println("播放CD音樂。。。。。" + this.toString() +" " +this.title+ " by " +this.artist); }
}
#### 6.6.5 注入list類型 -通過構(gòu)造函數(shù) applicationContext.xml
I Do 1 I Do 2 I Do 3
CompactDisc
public class CompactDisc {
private String title; private String artist; //聲明一個(gè)list private Listtracks; public CompactDisc() { super(); System.out.println("CompacDisc構(gòu)造函數(shù)。。。。" + this.toString()); } public CompactDisc(String title, String artist) { this.title = title; this.artist = artist; System.out.println("CompacDisc有參構(gòu)造函數(shù)。。。。" + this.toString()); } //創(chuàng)建包含三個(gè)函數(shù)的構(gòu)造函數(shù) public CompactDisc(String title, String artist, List tracks) { this.title = title; this.artist = artist; this.tracks = tracks; System.out.println("CompacDisc有三個(gè)參構(gòu)造函數(shù)。。。。" + this.toString()); } public void play(){ System.out.println("播放CD音樂。。。。。" + this.toString() +" " +this.title+ " by " +this.artist); //循環(huán)打印tracks內(nèi)容 for (String track : this.tracks) { System.out.println("音樂:" + track); } }
}
***創(chuàng)建一個(gè)復(fù)雜對(duì)象類型*** 創(chuàng)建類型 Music
package com.cloud.deam.soundsystem;
public class Music {
private String title; private Integer duration; //創(chuàng)建getter setter 方法 public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Integer getDuration() { return duration; } public void setDuration(Integer duration) { this.duration = duration; } //創(chuàng)建無參構(gòu)造方法 public Music() { super(); } //創(chuàng)建有參構(gòu)造方法 public Music(String title, Integer duration) { this.title = title; this.duration = duration; }
}
CompactDisc
public class CompactDisc {
private String title; private String artist; //設(shè)置List為Music類型 private Listtracks; public CompactDisc() { super(); System.out.println("CompacDisc構(gòu)造函數(shù)。。。。" + this.toString()); } public CompactDisc(String title, String artist) { this.title = title; this.artist = artist; System.out.println("CompacDisc有參構(gòu)造函數(shù)。。。。" + this.toString()); } //設(shè)置List為Music類型 public CompactDisc(String title, String artist, List tracks) { this.title = title; this.artist = artist; this.tracks = tracks; System.out.println("CompacDisc有三個(gè)參構(gòu)造函數(shù)。。。。" + this.toString()); } public void play(){ System.out.println("播放CD音樂。。。。。" + this.toString() +" " +this.title+ " by " +this.artist); for (Music track : this.tracks) { //通過get方法獲取屬性 System.out.println("音樂:" + track.getTitle() + ".時(shí)長:" + track.getDuration()); } }
}
applicationContext.xml - 復(fù)雜的對(duì)象依賴注入
#### 6.6.6 注入set類型 -通過構(gòu)造函數(shù) CompactDisc
public class CompactDisc {
private String title; private String artist; //設(shè)置set為Music類型 private Listtracks; public CompactDisc() { super(); System.out.println("CompacDisc構(gòu)造函數(shù)。。。。" + this.toString()); } public CompactDisc(String title, String artist) { this.title = title; this.artist = artist; System.out.println("CompacDisc有參構(gòu)造函數(shù)。。。。" + this.toString()); } //設(shè)置set為Music類型 public CompactDisc(String title, String artist, set tracks) { this.title = title; this.artist = artist; this.tracks = tracks; System.out.println("CompacDisc有三個(gè)參構(gòu)造函數(shù)。。。。" + this.toString()); } public void play(){ System.out.println("播放CD音樂。。。。。" + this.toString() +" " +this.title+ " by " +this.artist); for (Music track : this.tracks) { //通過get方法獲取屬性 System.out.println("音樂:" + track.getTitle() + ".時(shí)長:" + track.getDuration()); } }
}
applicationContext.xml
- ***set和list區(qū)別在裝配的時(shí)候重復(fù)的值在set中會(huì)被過濾*** - ***set元素的順序能夠和插入一致。而list是無序的*** #### 6.6.7 注入MAP集合 -通過構(gòu)造函數(shù) CompactDisc
public class CompactDisc {
private String title; private String artist; private Maptracks; public CompactDisc() { super(); System.out.println("CompacDisc構(gòu)造函數(shù)。。。。" + this.toString()); } public CompactDisc(String title, String artist) { this.title = title; this.artist = artist; System.out.println("CompacDisc有參構(gòu)造函數(shù)。。。。" + this.toString()); } public CompactDisc(String title, String artist, Map tracks) { this.title = title; this.artist = artist; this.tracks = tracks; System.out.println("CompacDisc有三個(gè)參構(gòu)造函數(shù)。。。。" + this.toString()); } public void play(){ System.out.println("播放CD音樂。。。。。" + this.toString() +" " +this.title+ " by " +this.artist); for (String key : this.tracks.keySet()) { System.out.println("key:" + key ); Music music = this.tracks.get(key); System.out.println("音樂:" + music.getTitle() + ".時(shí)長:" + music.getDuration()); } }
}
applicationContext.xml
//map類型注入需要使用entry
#### 6.6.8 注入數(shù)組類型 -通過構(gòu)造函數(shù) CompactDisc
public class CompactDisc {
private String title; private String artist; //設(shè)置Music為數(shù)組類型 private Music[] tracks; public CompactDisc() { super(); System.out.println("CompacDisc構(gòu)造函數(shù)。。。。" + this.toString()); } public CompactDisc(String title, String artist) { this.title = title; this.artist = artist; System.out.println("CompacDisc有參構(gòu)造函數(shù)。。。。" + this.toString()); } //設(shè)置Music為數(shù)組類型 public CompactDisc(String title, String artist, Music[] tracks) { this.title = title; this.artist = artist; this.tracks = tracks; System.out.println("CompacDisc有三個(gè)參構(gòu)造函數(shù)。。。。" + this.toString()); } public void play(){ System.out.println("播放CD音樂。。。。。" + this.toString() +" " +this.title+ " by " +this.artist); for (Music track : this.tracks) { System.out.println("音樂:" + track.getTitle() + ".時(shí)長:" + track.getDuration()); } }
}
applicationContext.xml
#### 6.6.9 屬性注入 1.set注入屬性注入 applicationContext-properties.xml - property 注入元素
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
Music - 屬性注入只需set方法就可以 - 屬性的構(gòu)造方法,會(huì)走無參構(gòu)造函數(shù)
public class Music {
//聲明的是私有的成員變量 private String title; private Integer duration; //創(chuàng)建getter setter 方法 public String getTitle() { return title; } //setTitle是屬性 public void setTitle(String title) { this.title = title; System.out.println("--在" +this.toString() + "中注入title"); } public Integer getDuration() { return duration; } //setDuration是屬性 public void setDuration(Integer duration) { this.duration = duration; System.out.println("--在" +this.toString() + "中注入duration"); } //創(chuàng)建無參構(gòu)造方法 public Music() { super(); System.out.println("Music的構(gòu)造函數(shù)。。。"+this.toString()); } //創(chuàng)建有參構(gòu)造方法 public Music(String title, Integer duration) { this.title = title; this.duration = duration; }
}
AppTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-properties.xml")
public class AppTest {
@Test public void test(){ }
}
測(cè)試結(jié)果
Music的構(gòu)造函數(shù)。。。com.cloud.deam.soundsys
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75700.html
摘要:我的學(xué)習(xí)筆記匯總標(biāo)簽筆記分為兩大部分和筆記內(nèi)容主要是對(duì)一些基礎(chǔ)特性和編程細(xì)節(jié)進(jìn)行總結(jié)整理,適合了解基礎(chǔ)語法,想進(jìn)一步深入學(xué)習(xí)的人如果覺得不錯(cuò),請(qǐng)給,這也是對(duì)我的鼓勵(lì),有什么意見歡迎留言反饋目錄基礎(chǔ)鞏固筆記反射基礎(chǔ)鞏固筆記泛型基礎(chǔ)鞏 我的java&javaweb學(xué)習(xí)筆記(匯總) 標(biāo)簽: java [TOC] 筆記分為兩大部分:javase和javaweb javase javawe...
摘要:最近系統(tǒng)整理了一套初學(xué)者最佳的學(xué)習(xí)方法以及會(huì)遇到的坑等,希望對(duì)你有所幫助。正常的智商其實(shí),學(xué)習(xí)并不需要所謂的數(shù)學(xué)邏輯好,需要英語水平棒。大周期每天學(xué)習(xí)時(shí)間五個(gè)小時(shí)以上的,建議學(xué)習(xí)周期。三學(xué)習(xí)時(shí)會(huì)遇到的坑不知道學(xué)習(xí)的重點(diǎn),下面學(xué)習(xí)路線會(huì)畫。 最近系統(tǒng)整理了一套java初學(xué)者最佳的學(xué)習(xí)方法以及會(huì)遇到的坑等,希望對(duì)你有所幫助。 目錄: 一、學(xué)習(xí)java的前提 二、學(xué)習(xí)java的方法 三、學(xué)習(xí)...
摘要:而面向搜索引擎,就是我們要及時(shí)的使用百度谷歌遇到問題無法解決,先別急著放棄,可以去網(wǎng)絡(luò)尋找答案,你的坑大部分別人都已經(jīng)走過了,大部分都可以找到合適的解決方案。 showImg(https://segmentfault.com/img/remote/1460000019236352?w=866&h=456); 前言: ●眾多的語言,到底哪一門才是適合我的?●我們?yōu)槭裁匆獙W(xué)習(xí)Java語言呢...
摘要:請(qǐng)回復(fù)這個(gè)帖子并注明組織個(gè)人信息來申請(qǐng)加入。權(quán)限分配靈活,能者居之。數(shù)量超過個(gè),在所有組織中排名前。網(wǎng)站日超過,排名的峰值為。導(dǎo)航歸檔社區(qū)自媒體平臺(tái)微博知乎專欄公眾號(hào)博客園簡書合作侵權(quán),請(qǐng)聯(lián)系請(qǐng)抄送一份到贊助我們 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=...
摘要:請(qǐng)回復(fù)這個(gè)帖子并注明組織個(gè)人信息來申請(qǐng)加入。版筆記等到中文字幕翻譯完畢后再整理。數(shù)量超過個(gè),在所有組織中排名前。網(wǎng)站日超過,排名的峰值為。主頁歸檔社區(qū)自媒體平臺(tái)微博知乎專欄公眾號(hào)博客園簡書合作侵權(quán),請(qǐng)聯(lián)系請(qǐng)抄送一份到贊助我們 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1...
閱讀 2717·2021-11-11 16:55
閱讀 755·2021-09-04 16:40
閱讀 3138·2019-08-30 15:54
閱讀 2692·2019-08-30 15:54
閱讀 2474·2019-08-30 15:46
閱讀 455·2019-08-30 15:43
閱讀 3287·2019-08-30 11:11
閱讀 3041·2019-08-28 18:17