SpringIOC中常用的注解及其实现原理

118 阅读2分钟

注册Bean组件的方式

@Configuration 将一个类以配置类的形式作为Bean组件,该注解作用在类上。

@Bean 将方法返回的对象作为Bean组件,该注解作用在方法上。

//将MainConfig对象加入到IOC容器中;
//将Person对象加入到IOC容器中。
@Configuration
public class MainConfig {
   
   @Bean("person")
   public Person person() {
      return new Person("美美侠", 25);
   }
}

Bean组件的初始化和销毁

1、@Bean注解指定已有的方法作为初始化方法和销毁方法

@Bean注解的两个参数initMethoddestroyMethod分别用于指定初始化方法和销毁方法。

public class Person{
    //初始化方法
    public void initMethod(){
        System.out.println("==============");
        System.out.println("Person类的初始化方法");
        System.out.println("==============");
    }
    //销毁方法
    public void destroyMethod(){
        System.out.println("==============");
        System.out.println("Person类的销毁方法");
        System.out.println("==============");
    }
}
@Configuration
public class MainConfig {
   
   @Bean("person",initMethod = "initMethod",destroyMethod = "destroyMethod")
   public Person person() {
      return new Person("美美侠", 25);
   }
}

2、组件类实现InitializingBean接口和DisposableBean接口

public interface InitializingBean {

   void afterPropertiesSet() throws Exception;
}
public interface DisposableBean {

   void destroy() throws Exception;
}

如果类的初始化方法和重写afterPropertiesSet方法都存在,类的初始化方法优先级大于afterPropertiesSet方法

@PostConstruct是Java提供的注解,该注解指定的方法只会被执行一次,执行顺序为:Constructor(构造方法)@Autowired(依赖注入)@PostConstruct(注释的方法)

Bean组件作用域

  • singleton:单例,容器启动时,创建出所有的Bean组件放到IOC容器中,请求Bean组件时,从IOC容器中直接取。

  • prototype:原型,容器启动时没有创建Bean组件,而是等请求Bean组件的时候才去创建。

@Import注解

@Import注解中只有一个value参数,用于指定要创建组件的Class类。

@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();

}

栗子:@Import({Color.class})表示创建一个Color对象,放入IOC容器中。

@Import({Color.class})
@Configuration
public class MainConfig {
   
   @Bean("person")
   public Person person() {
      return new Person("美美侠", 25);
   }
}

两个特殊用法:

在@Import注解中使用ImportSelector导入Bean和使用ImportBeanDefinitionRegistrar导入Bean。

ImportSelectorImportBeanDefinitionRegistrar分别是两个接口。

public interface ImportSelector {
   //返回Class的类路径回被创建成Bean组件加入到IOC容器中
   String[] selectImports(AnnotationMetadata importingClassMetadata);
   
   @Nullable
   default Predicate<String> getExclusionFilter() {
      return null;
   }
}
public interface ImportBeanDefinitionRegistrar {

   default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,
         BeanNameGenerator importBeanNameGenerator) {

      registerBeanDefinitions(importingClassMetadata, registry);
   }
    //通过BeanDefinitionRegistry向容器中注册Bean组件
   default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
   }

}

BeanPostProcessor

//Bean组件后置处理器
public interface BeanPostProcessor {

    //在Bean的初始化方法前执行
   @Nullable
   default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
      return bean;
   }

    //在Bean的初始化方法后执行
   @Nullable
   default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
      return bean;
   }

}

未完待续...