⑤. 使用@Lookup注解解决问题
// 加上ComponentScan进行包扫描 一定要加上 @Configuration // @Import(Person.class) //如果要导入两个用下面的方式 //@Import({Person.class, MyConfig.MyImportBeanDefinitionRegistrar.class}) @ComponentScan(value = "com.xiaozhi") //这里一定要进行包扫描 public class MyConfig {
//@Autowired //依赖的组件是多实例就不能Autowired @Component public class Person{ private String name; @Autowired //依赖的组件是多实例就不能Autowired private Cat cat; public String getName() { return name; } public void setName(String name) { this.name = name; } public void setCat(Cat cat) { this.cat = cat; } @Lookup//去容器中找 public Cat getCat() { return cat; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } }
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); // } Person person = applicationContext.getBean(Person.class); Cat cat1 = person.getCat(); Cat cat2 = person.getCat(); //false,这里是false,表示获取到的是多列的 System.out.println(cat1==cat2); String[] names = applicationContext.getBeanDefinitionNames(); /** * 这里我们在配置文件中配置了@ComponentScan(value = "com.xiaozhi") * 进行扫描,可以看到这里的person和cat的名称 * cat * person */ for (String name : names) { System.out.println(name); } } }