自適應(yīng)營(yíng)銷網(wǎng)站模板互聯(lián)網(wǎng)營(yíng)銷培訓(xùn)班
目錄
1.?不創(chuàng)建參數(shù)類型的Bean
2.?創(chuàng)建一個(gè)與參數(shù)同類型同名的Bean
3.?創(chuàng)建多個(gè)與參數(shù)同類型,其中一個(gè)與參數(shù)同名的Bean
4. 創(chuàng)建一個(gè)與參數(shù)同類型不同名的Bean
5. 創(chuàng)建多個(gè)與參數(shù)同類型但不同名的Bean
對(duì)于@Bean修飾的方法,也可能需要從外部傳參,現(xiàn)說明@Bean的參數(shù)傳遞問題。
仍以BeanConfig類的userInfo方法為例,假設(shè)當(dāng)前方法需傳遞一個(gè)名為name的String類型的參數(shù)。
1.?不創(chuàng)建參數(shù)類型的Bean
BeanConfig類內(nèi)容如下:
package com.example.iocdemo1.Config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class BeanConfig {@Beanpublic UserInfo userInfo(String name){UserInfo userInfo1=new UserInfo();userInfo1.setId(1);userInfo1.setName(name);userInfo1.setAge(20);return userInfo1;}
}
運(yùn)行程序,啟動(dòng)日志報(bào)錯(cuò)如下:
即將參數(shù)name也視為一個(gè)bean,該bean的類型為String,當(dāng)前并未定義該bean,故報(bào)錯(cuò)。
2.?創(chuàng)建一個(gè)與參數(shù)同類型同名的Bean
修改BeanConfig類,為其增加一個(gè)名為name的String類型的Bean如下:
package com.example.iocdemo1.Config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class BeanConfig {@Beanpublic String name(){return "wangwu";}@Beanpublic UserInfo userInfo(String name){UserInfo userInfo1=new UserInfo();userInfo1.setId(1);userInfo1.setName(name);userInfo1.setAge(20);return userInfo1;}
}
保持啟動(dòng)類內(nèi)容不變,重新啟動(dòng)程序:
可見此時(shí)userInfo方法接收參數(shù)成功;
3.?創(chuàng)建多個(gè)與參數(shù)同類型,其中一個(gè)與參數(shù)同名的Bean
當(dāng)前userInfo方法需要一個(gè)名為name類型為String的參數(shù),現(xiàn)創(chuàng)建兩個(gè)String類型的Bean,一個(gè)Bean(name)與形參名保持一致,另外一個(gè)Bean(name2)與形參名不同:
package com.example.iocdemo1.Config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class BeanConfig {@Beanpublic String name(){return "wangwu";}@Beanpublic String name2(){return "zhaoliu";}@Beanpublic UserInfo userInfo(String name){UserInfo userInfo1=new UserInfo();userInfo1.setId(1);userInfo1.setName(name);userInfo1.setAge(20);return userInfo1;}
}
重新啟動(dòng)程序,日志如下:
可見當(dāng)前userInfo方法接收了與參數(shù)名相同(name)的那個(gè)Bean;
4. 創(chuàng)建一個(gè)與參數(shù)同類型不同名的Bean
當(dāng)前userInfo方法需要的參數(shù)類型為String,現(xiàn)創(chuàng)建一個(gè)String類型的Bean,該Bean的名稱(name2)與形參名稱(name)不同:
package com.example.iocdemo1.Config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class BeanConfig {@Beanpublic String name2(){return "zhaoliu";}@Beanpublic UserInfo userInfo(String name){UserInfo userInfo1=new UserInfo();userInfo1.setId(1);userInfo1.setName(name);userInfo1.setAge(20);return userInfo1;}
}
運(yùn)行程序,日志如下:
可見當(dāng)前userInfo方法接收了與參數(shù)雖然名稱不同(name)但類型相同(String)的那個(gè)Bean;
5. 創(chuàng)建多個(gè)與參數(shù)同類型但不同名的Bean
當(dāng)前userInfo方法需要的參數(shù)類型為String,現(xiàn)創(chuàng)建兩個(gè)String類型的Bean,兩個(gè)Bean的名稱(name2和name3)都與形參名稱(name)不同:
package com.example.iocdemo1.Config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class BeanConfig {@Beanpublic String name2(){return "zhaoliu";}@Beanpublic String name3(){return "tianqi";}@Beanpublic UserInfo userInfo(String name){UserInfo userInfo1=new UserInfo();userInfo1.setId(1);userInfo1.setName(name);userInfo1.setAge(20);return userInfo1;}
}
報(bào)錯(cuò)如下:
總結(jié)@Bean接收參數(shù)的原則:
1、首先根據(jù)類型獲取Bean,若沒有與參數(shù)類型匹配的Bean則報(bào)錯(cuò);
2、若滿足類型要求的Bean有多個(gè),則優(yōu)先獲取與參數(shù)同名的Bean。?
3、若存在一個(gè)名稱雖不匹配但類型匹配的Bean,則該Bean也可被@Bean接收;
4、若存在多個(gè)名稱雖不匹配但類型匹配的Bean,則無(wú)法匹配Bean,報(bào)錯(cuò);