SPRING02_核心注解、Bean、primary、DependsOn、Lazy、Scope、ComponentScan、详解Import、Lookup注解(三)

简介: SPRING02_核心注解、Bean、primary、DependsOn、Lazy、Scope、ComponentScan、详解Import、Lookup注解(三)

⑧. @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);
  }
}


微信图片_20220108223913.png


相关文章
|
6天前
|
运维 Java 程序员
Spring5深入浅出篇:基于注解实现的AOP
# Spring5 AOP 深入理解:注解实现 本文介绍了基于注解的AOP编程步骤,包括原始对象、额外功能、切点和组装切面。步骤1-3旨在构建切面,与传统AOP相似。示例代码展示了如何使用`@Around`定义切面和执行逻辑。配置中,通过`@Aspect`和`@Around`注解定义切点,并在Spring配置中启用AOP自动代理。 进一步讨论了切点复用,避免重复代码以提高代码维护性。通过`@Pointcut`定义通用切点表达式,然后在多个通知中引用。此外,解释了AOP底层实现的两种动态代理方式:JDK动态代理和Cglib字节码增强,默认使用JDK,可通过配置切换到Cglib
|
2天前
|
JSON 前端开发 Java
【JAVA进阶篇教学】第七篇:Spring中常用注解
【JAVA进阶篇教学】第七篇:Spring中常用注解
|
5天前
|
JavaScript Java 开发者
Spring Boot中的@Lazy注解:概念及实战应用
【4月更文挑战第7天】在Spring Framework中,@Lazy注解是一个非常有用的特性,它允许开发者控制Spring容器的bean初始化时机。本文将详细介绍@Lazy注解的概念,并通过一个实际的例子展示如何在Spring Boot应用中使用它。
17 2
|
6天前
|
前端开发 Java
SpringBoot之自定义注解参数校验
SpringBoot之自定义注解参数校验
16 2
|
12天前
|
消息中间件 安全 Java
在Spring Bean中,如何通过Java配置类定义Bean?
【4月更文挑战第30天】在Spring Bean中,如何通过Java配置类定义Bean?
20 1
|
12天前
|
Java Spring
springboot自带的@Scheduled注解开启定时任务
springboot自带的@Scheduled注解开启定时任务
|
15天前
|
前端开发 Java 数据格式
【Spring系列笔记】定义Bean的方式
在Spring Boot应用程序中,定义Bean是非常常见的操作,它是构建应用程序的基础。Spring Boot提供了多种方式来定义Bean,每种方式都有其适用的场景和优势。
32 2
|
15天前
|
XML JSON Java
【SpringBoot】springboot常用注解
【SpringBoot】springboot常用注解
|
Java Spring 容器
如何在 Spring 中自定义 scope
大家对于 Spring 的 scope 应该都不会默认。所谓 scope,字面理解就是“作用域”、“范围”,如果一个 bean 的 scope 配置为 singleton,则从容器中获取 bean 返回的对象都是相同的;如果 scope 配置为prototype,则每次返回的对象都不同。
2142 0
|
XML Java 数据格式
Spring(10)——bean作用范围(二)—自定义scope
10.7 自定义Scope 如果用户觉得Spring内置的几种Scope不能满足需求,则可以定制自己的Scope,即实现自己的org.springframework.beans.factory.config.Scope。
1231 0