spring5学习系列之------1 给容器注册组件一 @Configuration  @Bean  @Scope  @Lazy

               在工作中我们对spring已经很常用了,但是用的大部分都是spring一些很少的部分,该系列是基于spring5版本的,先介绍相关组件的内容,在涉及到源码内容。话不多说,直接上干货吧

        常用注解之给容器注册组件

       一般来说,最原始的spring使用方式是用到xml写一些配置文件,然后spring读取配置文件进行扫描并且注册到容器之中,但是现在基本上都是给予注解的开发,并且以springboot快速开发为主,springboot底层也是使用的spring,因此本系列基本上是基于注解方式的讲解。

首先idea 创建一个spring的项目,pom.xml引入相关配置

 spring之所以被用到的这么多,最重要的主要功能就是IOC和AOP,关于ioc和aop的相关概念这里就不多做解释了,首先我们测试一下ioc容器的相关功能,如何给容器中注册我们需要的组件呢?一般来说有四种方式

   1  @Bean[导入的第三方包里面的组件]

  我们首先创建一个POJO person ,然后写一个配置类并且标注注解@Configuration,和在方法写一个@Bean的注解

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String name;
    private Integer age;
    private String value;
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Config {
    @Bean
    public Person person(){
        return new Person("哈哈哈",18,"秀啊");
    }
}

之后新建一个配置类 ,第一行写上spring读取改配置类config,第二行是打印该容器中有多少bean,输入结果发现person已经注册到了容器之中。

@Test
    public void demo2(){
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
        String[] names = applicationContext.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }

 这里以上我们用到了2个注解 @Configuration  @Bean,其实这里config类上的@Configuration要不要我们都可以把person注入进去,只要AnnotationConfigApplicationContext去扫描了config这个类,那么我们写@Configuration注解的主要意思是表明该类是一个配置类,约定规范一些。既然我们已经把person注入到容器之中了,那我们该设想spring中的bean是单例还是多例?是在什么时候加载的呢?如何指定spring的bean的名称呢?

首先我们解决是单例还是多利的,测试方法测试一下就知道了重新改写测试方法,debug输出一下

 在默认情况下来说,容器中的bean是单例的,因为最后比较相等返回true,并且单例的bean是在容器直接初始化的时候就加载完毕,在我们debug第一行执行完毕的时候,可以看到容器中已经有个person这个bean,后续我们去调用getBean的时候不会在初始化。

  如何更改bean的名称呢?点开bean注解,会看到里面会有一个name value,通才情况下Bean的名称默认取的方法名,如需更改,只需要在@Bean("xxx") 即可,如果需要把原本的单例变成多实例,可以用到@Scope注解,通过看源码可得

  @Scope 默认为单例,可以指定为4中作用范围,但是基本上我们通常会用单例 singleton   和多实例 prototype,当如果用了该注解并且指定范围为多实例,那么spring容器不会再初始化的时候就创建好,而是再每次调用的时候创建一个实例

那么我们总结一下 :

      singleton (默认值):表示bean是单例的,ioc容器启动会调用方法创建对象放到ioc容器中。以后每次获取就是直接从容器                                             中(map.get())中拿。

     prototype:多实例的,ioc容器启动并不会去调用方法创建对象放在容器中。每次获取的时候才会调用方法创建对象,加载方                          式也是懒加载。

那么如何让单实例的bean有多实例的加载方式的特性呢,可以用一个注解修饰 @Lazy ,如下所示:

     至此,我们已经学习并且掌握了 spring常用注解的 4个, @Configuration  @Bean  @Scope  @Lazy,除了@Scope是spring2.5就有了,其余都是3.0时候引入的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章