⑧. @Lookup
①. 这个注解只能标注在方法上,这个注解用于有时候这个单实例组件就想使用原型模式引用另外的原型的组件,使其能够获取不一样的对象。 这个注解标注在方法上以后,它会去容器中找相关组件
②. A是单实例组件,A要使用B这个原型组件,在A获取B还是获取的是单实例的,如果用了这个@Lookup注解,那么A获取B,就是获取的是原型的B
③. 注意:@Lookup若标注在get()的方法上,使用@Bean的这种方式注册的组件,那么@Lookup这个注解就不不生效
④. 案列代码搭建
在Person类上自动注入Cat类,在Person类上标注@Component注解
在Cat类上标上@Scope注解以及@Component注解
重新获取到Person对象,调用两次getCat()方法获取到cat1、cat2
@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; } public Cat getCat() { return cat; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } }
@Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class Cat { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } }
@ComponentScan(value = "com.xiaozhi") @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); // } Person person = applicationContext.getBean(Person.class); Cat cat1 = person.getCat(); Cat cat2 = person.getCat(); //这里的结果是true,原因是Person单实例的,导致获取的Cat就是第一次创建 //person对象的时候,容器初始化的Cat System.out.println(cat1==cat2); } }