springbean的八种加载方式汇总

 更新时间:2022年10月12日 10:31:26   作者:桃花雪  
这篇文章主要介绍了springbean的八种加载方式,一种是XML方式声明bean,使用@Component及其衍生注解@Controller 、@Service、@Repository定义bean,还有其他方法,本文给大家介绍的非常详细,需要的朋友可以参考下

总结了一下八种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; 
}
 }

初始化实现FactoryBean接口的类,实现对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的基础上解决业务判断问题

导入实现了ImportSelector接口的类,实现对导入源的编程式处理解决根据逻辑业务加载bean的问题

public class MyImportSelector implements ImportSelector {
public String[] selectImports(AnnotationMetadata metadata) {

boolean flag = metadata.hasAnnotation("org.springframework.context.annotation.Import");//判断SpringConfig5的元数据有哪些特征。有没有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的目的

导入实现了ImportBeanDefinitionRegistrar接口的类,通过BeanDefinition的注册器注册实名bean,实现对
容器中bean的裁定,例如对现有bean的覆盖,进而达成不修改源代码的情况下更换实现的效果。

public class MyRegistrar implements ImportBeanDefinitionRegistrar {
@Override    
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {

//AnnotationMetadata 同importselect方式判断元数据

BeanDefinition beanDefinition = BeanDefinitionBuilder
.rootBeanDefinition(BookServiceImpl2.class) .getBeanDefinition();
registry.registerBeanDefinition("bookService", beanDefinition);
}
//

}
@Import(MyRegistrar.class)
public class SpringConfig6 { } 

8.BeanDefinitionRegistryPostProcessor接口

//在第七种的基础上解决相同名称bean过多,相互覆盖。谁优先级高的问题

导入实现了BeanDefinitionRegistryPostProcessor接口的类,通过BeanDefinition的注册器注册实名bean,
实现对容器中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的优先级最高

到此这篇关于springbean的八种加载方式的文章就介绍到这了,更多相关springbean加载方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IDEA中如何引入spring的命名空间

    IDEA中如何引入spring的命名空间

    这篇文章主要介绍了IDEA中如何引入spring的命名空间问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Springboot 使用maven release插件执行版本管理及打包操作

    Springboot 使用maven release插件执行版本管理及打包操作

    maven-release-plugin 可用于构建release版本项目,实现自动打tag、递增版本号、分发release版本jar包至仓库,接下来通过本文给大家介绍Springboot 使用maven release插件执行版本管理及打包操作,需要的朋友可以参考下
    2022-03-03
  • Java NIO 中 Selector 解析

    Java NIO 中 Selector 解析

    这篇文章主要介绍了Java NIO 中 Selector,Selector即选择器,选择器提供选择执行已经就绪的任务的能力即为翻译为多路复用,下面文章对Selector详细介绍内容,需要的小伙伴可以参考一下
    2022-02-02
  • 解决eclipse中maven引用不到已经存在maven中jar包的问题

    解决eclipse中maven引用不到已经存在maven中jar包的问题

    这篇文章主要介绍了解决eclipse中maven引用不到已经存在maven中jar包的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java编程实现打印螺旋矩阵实例代码

    Java编程实现打印螺旋矩阵实例代码

    这篇文章主要介绍了Java编程实现打印螺旋矩阵实例代码,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • SpringBoot使用JTA实现对多数据源的事务管理

    SpringBoot使用JTA实现对多数据源的事务管理

    了解事务的都知道,在我们日常开发中单单靠事务管理就可以解决绝大多数问题了,但是为啥还要提出JTA这个玩意呢,到底JTA是什么呢?他又是具体来解决啥问题的呢?本文小编就给大家介绍一下如何在Spring Boot中使用JTA实现对多数据源的事务管理
    2023-11-11
  • 深入讲解Java 9中的九个新特性

    深入讲解Java 9中的九个新特性

    Java 8 发布三年多之后,即将快到2017年7月下一个版本发布的日期了。 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新。 这里有九个令人兴奋的新功能将与 Java 9 一起发布。需要的朋友可以参考学习,下面来一起看看吧。
    2017-05-05
  • Java线程池ForkJoinPool(工作窃取算法)的使用

    Java线程池ForkJoinPool(工作窃取算法)的使用

    Fork就是把一个大任务切分为若干个子任务并行地执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果。Fork/Join 框架使用的是工作窃取算法。本文主要介绍了ForkJoinPool的使用,需要的可以参考一下
    2022-11-11
  • JAVA注解代码详解一篇就够了

    JAVA注解代码详解一篇就够了

    这篇文章主要介绍了Java注解详细介绍,本文讲解了Java注解是什么、Java注解基础知识、Java注解类型、定义Java注解类型的注意事项等内容,需要的朋友可以参考下
    2021-07-07
  • java版微信公众平台后台接入

    java版微信公众平台后台接入

    这篇文章主要为大家详细介绍了java版微信公众平台后台接入,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07

最新评论