Spring注解驱动开发——组件注册 @Scope设置组件作用域

@Scope

      prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。

 每次获取的时候才会调用方法创建对象;

     singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。

 以后每次获取就是直接从容器(map.get())中拿,

     request:同一次请求创建一个实例

     session:同一个session创建一个实例

@Scope("prototype")

      prototype:多实例的

conf配置文件

    @Scope("prototype")
    @Bean
    public Person person(){
return new Person("张三",99);
    }

Junit测试

    @Test
    public void test02(){
        String [] af=applica.getBeanDefinitionNames();
//        for (String string : af) {
//            System.out.println(string);
//        }
      System.out.println("ioc容器创建完成");
      Object obj=  applica.getBean("person");
      Object obj2=  applica.getBean("person");
      
      System.out.println(obj);
      System.out.println(obj2);
      System.out.println(obj2==obj);
    }

输出

 

 

 不相等说明不是同一个对象,是多实例的。

@Scope("singleton")

singleton:单实例的(默认值---》即不写也是单实例)

conf配置文件

    
    @Scope("singleton")
    @Bean
    public Person person(){
        System.out.println("给容器中添加person");
        return new Person("张三",99);
    }
    

输出

 

 同一对象

@Scope

singleton:单实例的(默认值---》即不写也是单实例

 

conf配置文件

    
    @Scope("singleton")
    @Bean
    public Person person(){
        System.out.println("给容器中添加person");
        return new Person("张三",99);
    }
    

输出

 

确实如此

  singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。

 以后每次获取就是直接从容器(map.get())中拿。

测试

 

    @Scope("singleton")
    @Bean
    public Person person(){
        System.out.println("给容器中添加person");
        return new Person("张三",99);
    }
    @Test
    public void test02(){
        //创建ioc容器
        ApplicationContext applica=    new     AnnotationConfigApplicationContext(MyConf2.class);

//        String [] af=applica.getBeanDefinitionNames();
////        for (String string : af) {
////            System.out.println(string);
////        }
//      System.out.println("ioc容器创建完成");
//      Object obj=  applica.getBean("person");
//      Object obj2=  applica.getBean("person");
//      
//      System.out.println(obj);
//      System.out.println(obj2);
//      System.out.println(obj2==obj);
    }
    

输出

 

 

      prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。

 每次获取的时候才会调用方法创建对象;

测试

    @Scope("prototype")
    @Bean
    public Person person(){
        System.out.println("给容器中添加person");
        return new Person("张三",99);
    }
    @Test
    public void test02(){
        //创建ioc容器
        ApplicationContext applica=    new     AnnotationConfigApplicationContext(MyConf2.class);

//        String [] af=applica.getBeanDefinitionNames();
////        for (String string : af) {
////            System.out.println(string);
////        }
//      System.out.println("ioc容器创建完成");
//      Object obj=  applica.getBean("person");
//      Object obj2=  applica.getBean("person");
//      
//      System.out.println(obj);
//      System.out.println(obj2);
//      System.out.println(obj2==obj);
    }
    

输出

 

并没有输出

再次测试

 

 

 

 发现获取的时候创建了对象。

 

posted @ 2021-07-25 22:18  KwFruit  阅读(50)  评论(0编辑  收藏  举报