2.Spring的IOC容器里面加入对象的常见方式
概述
使用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(); } 123456789101112ImportSelector 接口
用于实现动态 注册 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"}; } } 123456789ImportBeanDefinitionRegistrar接口
是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); } } } 1234567891011121314Ongwu博客 版权声明:以上内容未经允许不得转载!授权事宜或对内容有异议或投诉,请联系站长,将尽快回复您,谢谢合作!