注册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注解的两个参数initMethod和destroyMethod分别用于指定初始化方法和销毁方法。
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。
ImportSelector和ImportBeanDefinitionRegistrar分别是两个接口。
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;
}
}
未完待续...