②. 使用@Import的方式注入
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Import { /** * 1.直接写class person = Person{name='null'}:利用无参构造创建出对象放在容器中 * 2.ImportSelector * 3.ImportBeanDefinitionRegistrar * {@link Configuration @Configuration}, {@link ImportSelector}, * {@link ImportBeanDefinitionRegistrar}, or regular component classes to import. */ Class<?>[] value(); }
@Configuration @Import(Person.class) public class MyConfig { }
③. 新建Cat类,使用Import的方式导入,我们使用ImportBeanDefinitionRegistrar的方式给Cat进行注册
BeanDefinitionRegistry:这个相当于档案库
BeanDefinition:这个一个个的实例图纸对象
package com.xiaozhi.bean; public class Cat { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } }
@Configuration // @Import(Person.class) //如果要导入两个用下面的方式 @Import({Person.class, MyConfig.MyImportBeanDefinitionRegistrar.class}) public class MyConfig { // @Bean // public Person person(){ // Person person=new Person(); // person.setName("TANGZHI"); // return person; // } /** * BeanDefinitionRegistry:Bean定义信息注册中心,图纸中心 * 它里面都是BeanDefinition */ static class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { //BeanDefinition RootBeanDefinition catDefinition = new RootBeanDefinition(); catDefinition.setBeanClass(Cat.class); //Spring 这个实例的类型 registry.registerBeanDefinition("tomcat",catDefinition); } } }
public class AnnotationMainTest { public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class); // Person person = applicationContext.getBean(Person.class); // System.out.println("person = " + person); String[] names = applicationContext.getBeanDefinitionNames(); /** * 如果使用的是import方式导入的,那么这个bean的名字就是全类名 * com.xiaozhi.bean.Person * tomcat */ for (String name : names) { System.out.println(name); } } }