乐趣区

spring注解开发之给IOC容器注入组件的四种方式

1、包扫描加组件注解的方式如加入下列注解 spring 会把注解标注的类创建出来放入 IOC 容器

@Controller/@Service/@Repository/@Component
@Configuration // 告诉 spring 这是一个配置类
@ComponentScan(value = "com.ping")//value 指定扫描的基础包
public class ConfigDemo {}

2、使用 `@Bean(导入第三方包里面的组件)

@Configuration // 告诉 spring 这是一个配置类
public class ConfigDemo {

//IOC 容器中添加的组件默认是单实例的
// 给容器中注册一个 Bean; 类型为返回值的类型,id 默认是用方法名作为 id
@Bean(value = "Person")
public Person person01(){return new Person(18,"zhangsan");
}

}

3、@Import(快速给容器中导入一个组件 id 默认是组件的全类名)@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id 默认是全类名
          ImportSelector: 返回需要导入的组件的全类名数组
          ImportBeanDefinitionRegistrar: 手动注册 bean 到容器中
          
@Import({MyImportSelector.class, MyImportBeanDefinitionRegister.class})
@Configuration
public class ConfigDemo2 {}

/**
* 自定义逻辑返回需要导入的组件
*/
public class MyImportSelector implements ImportSelector {

// 返回值,就是导入到容器中的全类名
//AnnotationMetadata: 当前标注 @Import 注解的类的所有注解信息
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    // 方法不要返回 null 值
    return new String[]{"com.ping.entity.Color","com.ping.entity.Red"};
}

}

/**

  • AnnotationMetadata: 当前类的注解信息
  • BeanDefinitionRegistry: BeanDefinition 注册类
  • 把所有需要添加到容器中的 bean 调用
  • BeanDefinitionRegistry.registerBeanDefinition 手动注册进来

*/
public class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {

public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry){if(registry.containsBeanDefinition("com.ping.entity.Red")){
        // 指定 Bean 定义信息,(bean 的类型,Bean...)RootBeanDefinition rootBeanDefinition = new RootBeanDefinition("com.ping.entity.RainBow");
        // 注册一个 bean 指定 bean 名
        registry.registerBeanDefinition("rainBow",rootBeanDefinition);
    }

}

}

4、使用 spring 提供的 FactoryBean (工厂 bean)
     默认获取到的是工厂 bean 调用 getObject() 创建的对象
     要获取工厂 Bean 本身,我们需要给 id 前面加上一个 &
         &colorFactoryBean
@Configuration
public class ConfigDemo2 {

    @Bean
    public ColorFactoryBean colorFactoryBean(){return new ColorFactoryBean();
    }
}
// 测试 FactoryBean 的类型和获取获取工厂 bean 本身
 public static void main(String[] args) {
    AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(ConfigDemo2.class);
                
        Object bean1 = applicationContext.getBean("colorFactoryBean");
        Object bean2 = applicationContext.getBean("&colorFactoryBean");
        System.out.println(bean1==bean2);
        System.out.println("bean2 的类型:"+bean2.getClass());
退出移动版