Spring5 - 向IOC容器中添加组件的4种方式

简介: Spring5 - 向IOC容器中添加组件的4种方式

20201011181240642.png

概述


简单来说,4种方式

  • @CompentScan + @Controller @Service @Respository @compent等注解
  • @Bean
  • @Import
  • FacotryBean

接下来我们针对每种方式,来演示一下


方式一: @CompentScan

适用场景

一般我们自己写的代码都是通过这种方式来实现的bean加载到ioc容器中

Code

查考: Spring5源码 - Spring IOC 注解复习 @CompentScan 部分


方式二: @Bean


适用场景


通常我们初始化Redis 、数据库等等,都会使用这种方式,即 适用于导入第三方组件的类


Code

举个例子

 @Bean
    public JedisPool redisPoolFactory() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(maxIdle);
        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);
        return jedisPool;
    }


方式三: @Import

适用场景

第三方的组件 可以使用这种方式

导入的组件的id为类的全路径名


20201011192913356.png


Code Demo1

【components】

package com.artisan.base.importTest.component;
public class Bean7 {
}
package com.artisan.base.importTest.component;
public class Bean8 {
}

【配置类】

package com.artisan.base.importTest.config;
import com.artisan.base.importTest.component.Bean7;
import com.artisan.base.importTest.component.Bean8;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(value = {Bean7.class, Bean8.class})
public class IMPConfig {
}


【验证】

package com.artisan.base.importTest;
import com.artisan.base.importTest.config.IMPConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2020/10/11 19:05
 * @mark: show me the code , change the world
 */
public class Test {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(IMPConfig.class);
    for (String beanDefinitionName : ac.getBeanDefinitionNames()) {
      System.out.println(beanDefinitionName);
    }
    System.out.println("========================");
    // beanname为全路径名
    System.out.println(ac.getBean("com.artisan.base.importTest.component.Bean7"));
  }
}


20201011191648377.png

Code Demo2 + 实现 ImportSelector接口

【自定義ImportSelector】

package com.artisan.base.importTest.importSelector;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
/**
 * @author 小工匠
 * @version 1.0
 * @description:
 * @date 2020/10/11 19:20
 * @mark: show me the code , change the world
 */
public class ArtisanImportSelector  implements ImportSelector {
  @Override
  public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    return new String[]{"com.artisan.base.importTest.component.Bean6666"};
  }
}


20201011193044461.png


【测试】

20201011193409858.png


Code Demo3 + 实现 ImportBeanDefinitionRegistrar接口

package com.artisan.base.importTest.importSelector;
import com.artisan.base.importTest.component.Bean7777;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2020/10/11 19:26
 * @mark: show me the code , change the world
 */
public class ArtisanBeanDefinitionRegister implements ImportBeanDefinitionRegistrar  {
  @Override
  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Bean7777.class);
    registry.registerBeanDefinition("bean7777",rootBeanDefinition);
  }
}


【配置类】

20201011195814167.png

【测试结果】


2020101119595653.png


方式四 FacotryBean

适用场景

比如整合第三方框架,MyBatis

Spring5源码 - 08 BeanFactory和FactoryBean 源码解析 & 使用场景


Code

【FactoryBean】

package com.artisan.base.factoryBean;
import org.springframework.beans.factory.FactoryBean;
/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2020/10/11 21:49
 * @mark: show me the code , change the world
 */
public class ArtisanFactoryBean  implements FactoryBean {
  @Override
  public Object getObject() throws Exception {
    return new Bean8();
  }
  @Override
  public Class<?> getObjectType() {
    return Bean8.class;
  }
  @Override
  public boolean isSingleton() {
    return true;
  }
}


【配置类】

package com.artisan.base.factoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FBConfig {
  // 实例化ArtisanFactoryBean
  @Bean  
  public ArtisanFactoryBean artisanFactoryBean() {
    return new ArtisanFactoryBean();
  }
}


【pojo】

package com.artisan.base.factoryBean;
public class Bean8 {
  public Bean8() {
    System.out.println("Bean8 Create");
  }
}


【测试】

package com.artisan.base.factoryBean;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(FBConfig.class);
    System.out.println("=========================");
    // 调用FactoryBean的getObject方法
    System.out.println(ac.getBean("artisanFactoryBean"));
    // & 获取FactoryBean本身
    System.out.println(ac.getBean("&artisanFactoryBean"));
  }
}


20201011224134111.png


相关文章
|
8月前
|
Web App开发 前端开发 JavaScript
前端新利器:CSS容器查询——让组件真正“自适应
前端新利器:CSS容器查询——让组件真正“自适应
484 83
|
5月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
5月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
629 2
|
8月前
|
JSON 前端开发 Java
Spring MVC 核心组件与请求处理机制详解
本文解析了 Spring MVC 的核心组件及请求流程,核心组件包括 DispatcherServlet(中央调度)、HandlerMapping(URL 匹配处理器)、HandlerAdapter(执行处理器)、Handler(业务方法)、ViewResolver(视图解析),其中仅 Handler 需开发者实现。 详细描述了请求执行的 7 步流程:请求到达 DispatcherServlet 后,经映射器、适配器找到并执行处理器,再通过视图解析器渲染视图(前后端分离下视图解析可省略)。 介绍了拦截器的使用(实现 HandlerInterceptor 接口 + 配置类)及与过滤器的区别
799 0
|
10月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
276 18
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
909 26
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
XML Java 数据格式
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
158 1
|
XML druid Java
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
237 0