springbean的八種加載方式匯總
總結(jié)了一下八種bean的加載方式
1.XML方式聲明bean
不贅述了
2.使用@Component及其衍生注解@Controller 、@Service、@Repository定義bean
@Service
public class BookServiceImpl implements BookService { }3.ApplicationContex的register方法
public class AppImport {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(SpringConfig5.class);
ctx.register(Cat.class);
String[] names = ctx.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
}4.第三方bean加載方式
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {
@Bean
public DruidDataSource getDataSource(){
DruidDataSource ds = new DruidDataSource();
return ds;
}
}初始化實(shí)現(xiàn)FactoryBean接口的類,實(shí)現(xiàn)對(duì)bean加載到容器之前的批處理操作
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {
@Bean
public DruidDataSource getDataSource(){
DruidDataSource ds = new DruidDataSource();
return ds; }
}
public class SpringConfig8 {
@Bean
public BookFactoryBean book(){
return new BookFactoryBean();
}
}5.使用@Import注解
解決無侵入式加載,降低耦合問題
@Import(Dog.class)
public class SpringConfig5 { } 被導(dǎo)入的bean無需使用注解聲明為bean
public class Dog { }此形式可以有效的降低源代碼與Spring技術(shù)的耦合度,在spring技術(shù)底層及諸多框架的整合中大量使用
6.ImportSelector接口
在import的基礎(chǔ)上解決業(yè)務(wù)判斷問題
導(dǎo)入實(shí)現(xiàn)了ImportSelector接口的類,實(shí)現(xiàn)對(duì)導(dǎo)入源的編程式處理解決根據(jù)邏輯業(yè)務(wù)加載bean的問題
public class MyImportSelector implements ImportSelector {
public String[] selectImports(AnnotationMetadata metadata) {
boolean flag = metadata.hasAnnotation("org.springframework.context.annotation.Import");//判斷SpringConfig5的元數(shù)據(jù)有哪些特征。有沒有import注解
if(flag){
return new String[]{"com.itheima.domain.Dog"};
}
return new String[]{"com.itheima.domain.Cat"};
}
}
@Import(MyImportSelector.class)
public class SpringConfig5 { } 7.ImportBeanDefinitionRegistrar接口
//在importselect基礎(chǔ)上達(dá)到覆蓋已有相同名稱bean的目的
導(dǎo)入實(shí)現(xiàn)了ImportBeanDefinitionRegistrar接口的類,通過BeanDefinition的注冊(cè)器注冊(cè)實(shí)名bean,實(shí)現(xiàn)對(duì)
容器中bean的裁定,例如對(duì)現(xiàn)有bean的覆蓋,進(jìn)而達(dá)成不修改源代碼的情況下更換實(shí)現(xiàn)的效果。
public class MyRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
//AnnotationMetadata 同importselect方式判斷元數(shù)據(jù)
BeanDefinition beanDefinition = BeanDefinitionBuilder
.rootBeanDefinition(BookServiceImpl2.class) .getBeanDefinition();
registry.registerBeanDefinition("bookService", beanDefinition);
}
//
}
@Import(MyRegistrar.class)
public class SpringConfig6 { } 8.BeanDefinitionRegistryPostProcessor接口
//在第七種的基礎(chǔ)上解決相同名稱bean過多,相互覆蓋。誰優(yōu)先級(jí)高的問題
導(dǎo)入實(shí)現(xiàn)了BeanDefinitionRegistryPostProcessor接口的類,通過BeanDefinition的注冊(cè)器注冊(cè)實(shí)名bean,
實(shí)現(xiàn)對(duì)容器中bean的最終裁定
public class MyPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
BeanDefinition beanDefinition = BeanDefinitionBuilder
.rootBeanDefinition(BookServiceImpl4.class) .getBeanDefinition();
registry.registerBeanDefinition("bookService", beanDefinition);
}
}
@Import({BookServiceImpl1.class, MyPostProcessor.class, MyRegistrar2.class, MyRegistrar.class})
public class SpringConfig8 {
}如果BookServiceImpl1.class, MyPostProcessor.class, MyRegistrar.class, MyRegistrar.class中bean的名稱相同MyPostProcessor.class的優(yōu)先級(jí)最高
到此這篇關(guān)于springbean的八種加載方式的文章就介紹到這了,更多相關(guān)springbean加載方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)中的HashMap和HashSet詳解
HashMap和HashSet都是存儲(chǔ)在哈希桶之中,通過本文我們可以先了解一些哈希桶是什么,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-10-10
解讀nextLine().split(“[\\s]“)的意思
這篇文章主要介紹了解讀nextLine().split(“[\\s]“)的意思,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Java泛型之協(xié)變與逆變及extends與super選擇
這篇文章主要介紹了Java泛型之協(xié)變與逆變及extends與super選擇,文章圍繞主題內(nèi)容展開詳細(xì)內(nèi)容介紹,需要的小伙伴可以參考一下2022-05-05
springboot中如何去整合shrio實(shí)例分享
這篇文章主要介紹了springboot中如何去整合shrio實(shí)例分享的相關(guān)資料,需要的朋友可以參考下2023-08-08
深入探究MyBatis插件機(jī)制靈活擴(kuò)展及自定義增強(qiáng)框架能力
這篇文章主要介紹了深入探究MyBatis插件機(jī)制靈活擴(kuò)展及自定義增強(qiáng)框架能力2024-01-01
SpringBoot項(xiàng)目使用內(nèi)置的單機(jī)任務(wù)調(diào)度功能詳解
這篇文章主要介紹了SpringBoot項(xiàng)目使用內(nèi)置的單機(jī)任務(wù)調(diào)度功能詳解,SpringBoot框架中提供了2個(gè)注解來讓開發(fā)者快速配置來實(shí)現(xiàn)單機(jī)定時(shí)任務(wù)調(diào)度的功能,分別是@EnableScheduling和 @Scheduled,需要的朋友可以參考下2024-01-01
解決SpringBoot jar包中的文件讀取問題實(shí)現(xiàn)
這篇文章主要介紹了解決SpringBoot jar包中的文件讀取問題實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

