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


相关文章
|
10天前
|
Java 测试技术 开发者
IoC容器有什么作用?
【4月更文挑战第30天】IoC容器有什么作用?
29 0
|
10天前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
21 0
|
10天前
|
安全 Java 开发者
在Spring框架中,IoC和AOP是如何实现的?
【4月更文挑战第30天】在Spring框架中,IoC和AOP是如何实现的?
21 0
|
10天前
|
Java 开发者 容器
IoC容器如何实现依赖注入?
【4月更文挑战第30天】IoC容器如何实现依赖注入?
20 0
|
10天前
|
XML Java 数据格式
如何配置IoC容器?
【4月更文挑战第30天】如何配置IoC容器?
18 0
|
10天前
|
XML Java 程序员
什么是Spring的IoC容器?
【4月更文挑战第30天】什么是Spring的IoC容器?
19 0
|
1天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
1天前
|
存储 安全 数据库
【Docker 专栏】Docker 容器内应用的状态持久化
【5月更文挑战第9天】本文探讨了Docker容器中应用状态持久化的重要性,包括数据保护、应用可用性和历史记录保存。主要持久化方法有数据卷、绑定挂载和外部存储服务。数据卷是推荐手段,可通过`docker volume create`命令创建并挂载。绑定挂载需注意权限和路径一致性。利用外部存储如数据库和云服务可应对复杂需求。最佳实践包括规划存储策略、定期备份和测试验证。随着技术发展,未来将有更智能的持久化解决方案。
【Docker 专栏】Docker 容器内应用的状态持久化
|
1天前
|
机器学习/深度学习 监控 Kubernetes
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
【5月更文挑战第9天】本文探讨了Docker容器服务的自动扩展与缩容原理及实践,强调其在动态业务环境中的重要性。通过选择监控指标(如CPU使用率)、设定触发条件和制定扩展策略,实现资源的动态调整。方法包括云平台集成和使用Kubernetes等框架。实践中,电商平台和实时数据处理系统受益于此技术。注意点涉及监控数据准确性、扩展速度和资源分配。未来,智能算法将提升扩展缩容的效率和准确性,成为关键技术支持。
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
|
1天前
|
Java 数据库连接 Docker
【Docker 专栏】Docker 容器内环境变量的管理与使用
【5月更文挑战第9天】本文介绍了Docker容器中环境变量的管理与使用,环境变量用于传递配置信息和设置应用运行环境。设置方法包括在Dockerfile中使用`ENV`指令或在启动容器时通过`-e`参数设定。应用可直接访问环境变量或在脚本中使用。环境变量作用包括传递配置、设置运行环境和动态调整应用行为。使用时注意变量名称和值的合法性、保密性和覆盖问题。理解并熟练运用环境变量能提升Docker技术的使用效率和软件部署质量。
【Docker 专栏】Docker 容器内环境变量的管理与使用

热门文章

最新文章