(1)import注解简介
(2)import注解源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
Class<?>[] value();
}
(3)import案例实战
//汽车接口
public interface Car {
}
//奔驰类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BenChiCar implements Car{
private String name = "奔驰汽车";
}
//宝马类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaoMaCar implements Car{
private String name = "宝马汽车";
}
//奥迪类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AoDiCar implements Car{
private String name = "奥迪汽车";
}
@Configuration
@Import(value = {BaoMaCar.class, AoDiCar.class, BenChiCar.class})
public class CarBeanManager {
}
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
//扫描指定的包,包括子包
context.scan("com.lixiang");
//里面完成初始化操作,核心方法
context.refresh();
Map<String, Car> beansOfType = context.getBeansOfType(Car.class);
beansOfType.forEach((k,v)-> System.out.println(k+"="+v));
}
}
(1)importSelector批量导入简介
(2)importSelector源码
public interface ImportSelector {
//该方法的返回值是一个String数组,用于指定需要注册的Bean的类名。
String[] selectImports(AnnotationMetadata importingClassMetadata);
@Nullable
default Predicate<String> getExclusionFilter() {
return null;
}
}
(3)案例实战
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[] {"com.lixiang.domain.AoDiCar","com.lixiang.domain.BaoMaCar","com.lixiang.domain.BenChiCar"};
}
}
@Configuration
//只需要引入MyImportSelector即可
@Import(value = {MyImportSelector.class})
public class CarBeanManager {
}
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
//扫描指定的包,包括子包
context.scan("com.lixiang");
//里面完成初始化操作,核心方法
context.refresh();
Map<String, Car> beansOfType = context.getBeansOfType(Car.class);
beansOfType.forEach((k,v)-> System.out.println(k+"="+v));
}
}
(1)ImportBeanDefinitionRegistrar接口简介
(2)ImportBeanDefinitionRegistrar源码
public interface ImportBeanDefinitionRegistrar {
/**
* @param importBeanNameGenerator
* @param annotationMetadata 当前类的注解相关信息
* @param registry IOC容器里面bean的注册信息
*/
default void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry,
BeanNameGenerator importBeanNameGenerator) {
registerBeanDefinitions(importingClassMetadata, registry);
}
/**
* @param annotationMetadata 当前类的注解相关信息
* @param registry IOC容器里面bean的注册信息
*/
default void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
}
}
(3)案例实战
@Data
@NoArgsConstructor
@AllArgsConstructor
public class NewEnergyCar implements Car{
private String name = "新能源汽车";
}
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
/**
* 可以通过该方法进行手动注册
*/
boolean adCar = beanDefinitionRegistry.containsBeanDefinition("com.lixiang.domain.AoDiCar");
boolean bmCar = beanDefinitionRegistry.containsBeanDefinition("com.lixiang.domain.BaoMaCar");
boolean bcCar = beanDefinitionRegistry.containsBeanDefinition("com.lixiang.domain.BenChiCar");
if (adCar && bmCar && bcCar){
//IOC容器加个混合对象
BeanDefinition beanDefinition = new RootBeanDefinition(NewEnergyCar.class);
beanDefinitionRegistry.registerBeanDefinition("newEnergyCar",beanDefinition);
}
}
}
@Configuration
@Import(value = {MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class CarBeanManager {
}
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
//扫描指定的包,包括子包
context.scan("com.lixiang");
//里面完成初始化操作,核心方法
context.refresh();
Map<String, Car> beansOfType = context.getBeansOfType(Car.class);
beansOfType.forEach((k,v)-> System.out.println(k+"="+v));
}
}
(4)BeanDefinition 介绍
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。