文档章节

【Spring 系列 给IOC容器添加组件的几种方式总结】

HansonReal
 HansonReal
发布于 2018/07/17 17:53
字数 701
阅读 61
收藏 2

给Spring 注册Bean的几种方式总结。其中使用@Import注解是Spring Boot 完成自动配置的一个核心注解。

1、Spring 中给IOC容器添加组件的几种方式

  • 在Spring的配置文件中,配置Bean(基于XML方式)
  • 使用注解(@Controller@Service等)配合上组件扫描器@ComponentScan
  • 使用@Bean注解
  • 使用@Import注解
  • 使用Spring 提供的 FactoryBean

2、对部分方式进行实现

2.1、使用@Bean注解

  • 第一步:定义一个普通类Foo
public class Foo {
}
  • 第二步:定义一个配置类
@Configuration
public class ExampleConfiguration {
    @Bean
    public Foo foo(){
        return new Foo();
    }
}
  • 第三步:测试,遍历全部的Bean
public class SpringApplication {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExampleConfiguration.class);
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String delegate : beanDefinitionNames){
            System.out.println("Bean Name : "+delegate);
        }
        applicationContext.close();
    }
}
  • 第四步:测试运行结果
Bean Name : org.springframework.context.annotation.internalConfigurationAnnotationProcessor
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Tue Jul 17 17:36:15 CST 2018]; root of context hierarchy
Bean Name : org.springframework.context.annotation.internalAutowiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalRequiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalCommonAnnotationProcessor
Bean Name : org.springframework.context.event.internalEventListenerProcessor
Bean Name : org.springframework.context.event.internalEventListenerFactory
Bean Name : exampleConfiguration
Bean Name : foo

@Bean注解导入的Bean,默认Bean name为方法名

2.2、使用@Import注解

2.2.1、@Import(Foo.class)
  • 第一步:修改配置类
@Configuration
@Import(Foo.class)
public class ExampleConfiguration {

}
  • 第二步:测试
public class SpringApplication {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExampleConfiguration.class);
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String delegate : beanDefinitionNames){
            System.out.println("Bean Name : "+delegate);
        }
        applicationContext.close();
    }
}
  • 第三步:测试结果
Bean Name : org.springframework.context.annotation.internalConfigurationAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalAutowiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalRequiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalCommonAnnotationProcessor
Bean Name : org.springframework.context.event.internalEventListenerProcessor
Bean Name : org.springframework.context.event.internalEventListenerFactory
Bean Name : exampleConfiguration
Bean Name : com.hanson.bean.Foo

@Import导入的Bean 默认的Bean Name 为Bean 的全限定名称

2.2.2、@Import(FooImportSelectorImpl.class)
  • 第一步:定义一个类实现ImportSelector接口,并覆写其方法selectImports
public class FooImportSelectorImpl implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.hanson.bean.Foo"};
    }
}
  • 第二步:修改配置类
@Configuration
@Import(FooImportSelectorImpl.class)
public class ExampleConfiguration {
}
  • 第三步:启动测试类,查看运行结果
Bean Name : org.springframework.context.annotation.internalConfigurationAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalAutowiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalRequiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalCommonAnnotationProcessor
Bean Name : org.springframework.context.event.internalEventListenerProcessor
Bean Name : org.springframework.context.event.internalEventListenerFactory
Bean Name : exampleConfiguration
Bean Name : com.hanson.bean.Foo

这个方式有点控制反转的意思,就是只需要提供一个类的全限定名称,就能帮助我们注入到容器中。

2.2.3、@Import(FooImportBeanDefinitionRegistrarImpl.class)
  • 第一步:定义一个类实现ImportBeanDefinitionRegistrar并覆写其方法registerBeanDefinitions
public class FooImportBeanDefinitionRegistrarImpl implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
                                        BeanDefinitionRegistry registry) {
        RootBeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClass(Foo.class);
        registry.registerBeanDefinition("fooExample", beanDefinition);
    }
}
  • 第二步:修改配置类
@Configuration
@Import(FooImportBeanDefinitionRegistrarImpl.class)
public class ExampleConfiguration {
}
  • 第三步:运行测试类,并查看结果
Bean Name : org.springframework.context.annotation.internalConfigurationAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalAutowiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalRequiredAnnotationProcessor
Bean Name : org.springframework.context.annotation.internalCommonAnnotationProcessor
Bean Name : org.springframework.context.event.internalEventListenerProcessor
Bean Name : org.springframework.context.event.internalEventListenerFactory
Bean Name : exampleConfiguration
Bean Name : fooExample

这个方式需要程序员手动构建一个BeanDefinition对象。并且为他设置一个Bean Name

© 著作权归作者所有

共有 人打赏支持
HansonReal

HansonReal

粉丝 19
博文 15
码字总数 11872
作品 0
无锡
程序员
私信 提问
【Spring Boot 系列 自动配置原理分析】

在Spring Boot 中我们想要使用某个功能只需要在POM文件中添加对应的依赖。然后整个应用程序便具备了这个功能。那么这是如何实现的呢? 通过分析Spring Boot 示例程序来分析Spring Boot 自动配...

HansonReal
2018/07/18
0
0
Spring 使用javabean当配置类原理

1、web容器在启动的时候,会扫描每个jar包下的META-INF/services/javax.servlet.ServletContainerInitializer 2、加载这个文件指定的类SpringServletContainerInitializer 3、spring的应用一...

暗中观察
2018/06/17
0
0
三条路线告诉你如何掌握Spring IoC容器的核心原理

一、前言 前三篇已经从历史的角度和大家一起探讨了为什么会有Spring,Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国。本节的主要目的就是通过一个切入点带大家一...

Java小铺
2018/08/27
0
0
Spring IoC(更新中)

概念 IoC(控制反转,也叫依赖注入DI)是Spring的核心,几乎Spring的所有组件都要建立在此基础之上,包括AOP,声明式事务,SpringMVC等等。那么IoC的主要目的是什么呢?两个字“解耦”。为什么...

互联网小龙虾
2014/03/04
0
0
【死磕 Spring】----- IOC 之深入理解 Spring IoC

版权声明:版权声明:转载前请留言获得作者许可,转载后标明作者 chenssy 和原文出处。原创不易,感谢您的支持 https://blog.csdn.net/chenssy/article/details/82343456 在一开始学习 Spri...

chenssy
2018/09/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spark in action on Kubernetes - Playground搭建与架构浅析

前言 Spark是非常流行的大数据处理引擎,数据科学家们使用Spark以及相关生态的大数据套件完成了大量又丰富场景的数据分析与挖掘。Spark目前已经逐渐成为了业界在数据处理领域的行业标准。但是...

阿里云官方博客
5分钟前
0
0
小白大数据学习路线

学习大数据首先了解大数据技术得板块划分: 数据计算(离线计算):Hadoop、spark 数据计算(实时计算):storm、spartstreaming、flink 其他框架:zookeeper 数据采集:flume、Kafka 数据存...

董黎明
18分钟前
0
0
mariadb 内存占用优化

本文由云+社区发表 作者:工程师小熊 摘要:我们在使用mariadb的时候发现有时候不能启动起来,在使用过程中mariadb占用的内存很大,在这里学习下mariadb与内存相关的配置项,对mariadb进行调...

腾讯云加社区
今天
2
0
spring security 自定义登录认证

spring security 自定义认证登录 1.概要 1.1.简介 spring security是一种基于 Spring AOP 和 Servlet 过滤器的安全框架,以此来管理权限认证等。 1.2.spring security 自定义认证流程 1)认证...

EasyProgramming
今天
1
0
Win下Jenkins-2.138源码编译及填坑笔记

源码编译篇 1、 安装JDK1.8-181,操作系统添加JDK环境变量。Java -version验证一下。 注:Jenkins2.138版本,JDK必须jkd1.8.0-101以上,不支持Java9,Maven必须3.5.3以上。 2、 解压Maven3....

编程SHA
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部