首页云计算2.Spring的IOC容器里面加入对象的常见方式

2.Spring的IOC容器里面加入对象的常见方式

时间2024-07-26 00:54:36发布ongwu分类云计算浏览47

概述

  使用XML配置文件、注解、java 配置、使用 import注解

使用xml配置文件 在xml配置文件中使用标签来定义Bean,通过ClassPathXmlApplicationContext等容器来加载 并初始化Bean 使用注解 使用Spring提供的注解,例如:@Component、@Service 、@Controller、@Repository 等注解来标识Bean通过@ComponentScan等注解扫描来加载并初始化Bean 使用java配置 可以使用java代码配置Bean,例如使用@Configuration和@Bean注解来定义Bean然后通过AnnotationConfigApplicationContext等容器来加载并初始化Bean 使用import注解 使用@Import注解来引入其它配置类,然后通过容器加载 并初始化Bean@Import注解提供了三种用法 直接Import导入ImportSelector接口批量ImportBeanDefinitionRegistrar条件注册

import注解

spring框架中的一个注解,用于在一个配置类中引入其它配置类或者普通的java类默认的bean名称是:类全限定名,即包名+类名

源码

@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Import { /** * {@link Configuration @Configuration}, {@link ImportSelector}, * {@link ImportBeanDefinitionRegistrar}, or regular component classes to import. */ Class<?>[] value(); } 123456789101112

ImportSelector 接口

  用于实现动态 注册 Bean的功能,批量导入对象到容器里,根据条件动态的选择需要注册的Bean,并加入spring容器,实现ImportSelector接口,这个接口的selectImports方法会返回一个String数组,数组中的值 就是添加的组件的全类名

源码

public interface ImportSelector { // 该方法的返回值是一个String数组,用于指定需要注册的Bean的类名 String[] selectImports(AnnotationMetadata importingClassMetadata); @Nullable default Predicate<String> getExclusionFilter() { return null; } } 12345678910

实战

import org.springframework.context.annotation.ImportSelector; import org.springframework.core.type.AnnotationMetadata; public class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.fun.complex.BlueColor"}; } } 123456789

ImportBeanDefinitionRegistrar接口

  是spring框架中的一个接口,用于实现动态 注册Bean的功能,ImportBeanDefinitionRegistrar可以运行时动态的向spring容器注册 BeanDefinition,与ImportSelector不同的是,ImportSelector只能返回注册的Bean的类名

源码

public interface ImportBeanDefinitionRegistrar { default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) { registerBeanDefinitions(importingClassMetadata, registry); } default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { } } 1234567891011

实践

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) { if (registry.containsBeanDefinition("com.fun.complex.BlueColor")) { // 如果存在,那么不再注册 System.out.println("存在。。。"); }else { // 不存在,注册 RootBeanDefinition definition = new RootBeanDefinition(BlueColor.class); registry.registerBeanDefinition("blue",definition); } } } 1234567891011121314

Ongwu博客 版权声明:以上内容未经允许不得转载!授权事宜或对内容有异议或投诉,请联系站长,将尽快回复您,谢谢合作!

展开全文READ MORE
5.SpringBoot核心源码-启动类源码分析 【网络安全】SSRF 之 Azure Digital Twins Explorer

游客 回复需填写必要信息