springbean的八種加載方式匯總
總結了一下八種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;
}
}初始化實現(xiàn)FactoryBean接口的類,實現(xiàn)對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 { } 被導入的bean無需使用注解聲明為bean
public class Dog { }此形式可以有效的降低源代碼與Spring技術的耦合度,在spring技術底層及諸多框架的整合中大量使用
6.ImportSelector接口
在import的基礎上解決業(yè)務判斷問題
導入實現(xiàn)了ImportSelector接口的類,實現(xiàn)對導入源的編程式處理解決根據(jù)邏輯業(yè)務加載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基礎上達到覆蓋已有相同名稱bean的目的
導入實現(xiàn)了ImportBeanDefinitionRegistrar接口的類,通過BeanDefinition的注冊器注冊實名bean,實現(xiàn)對
容器中bean的裁定,例如對現(xiàn)有bean的覆蓋,進而達成不修改源代碼的情況下更換實現(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接口
//在第七種的基礎上解決相同名稱bean過多,相互覆蓋。誰優(yōu)先級高的問題
導入實現(xiàn)了BeanDefinitionRegistryPostProcessor接口的類,通過BeanDefinition的注冊器注冊實名bean,
實現(xiàn)對容器中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)先級最高
到此這篇關于springbean的八種加載方式的文章就介紹到這了,更多相關springbean加載方式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java數(shù)據(jù)結構中的HashMap和HashSet詳解
HashMap和HashSet都是存儲在哈希桶之中,通過本文我們可以先了解一些哈希桶是什么,本文結合實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2023-10-10
解讀nextLine().split(“[\\s]“)的意思
這篇文章主要介紹了解讀nextLine().split(“[\\s]“)的意思,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
Java泛型之協(xié)變與逆變及extends與super選擇
這篇文章主要介紹了Java泛型之協(xié)變與逆變及extends與super選擇,文章圍繞主題內容展開詳細內容介紹,需要的小伙伴可以參考一下2022-05-05
解決SpringBoot jar包中的文件讀取問題實現(xiàn)
這篇文章主要介紹了解決SpringBoot jar包中的文件讀取問題實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08

