美文网首页Spring源码解析
Spring源码解析_Spring组件注册

Spring源码解析_Spring组件注册

作者: 猴小马_spancer | 来源:发表于2018-08-29 09:18 被阅读0次

    参考资料:<<Spring源码深度解析>>

    一、给容器注册组件的三种方式:

    • xml包扫描+@Component/@Controller/@Service/@Repository
    • 配置@Bean,可以对第三放jar进行注入
    • @Import 方式注入
    • 使用Spring提供的FactoryBean(工厂bean)

    1.默认获取到的是工厂bean调用 getObject 创建的对象
    2.要获取工厂bean本身,需要给 id 前加一个 " & " 标识

    二、 注解使用

    1、配置文件注解@Configuration/@Bean:

    • 创建一个类,用@Configuration,可以将该类注册为配置类,等同于原来的.xml配置文件。
    • 在配置类中可以填充实体bean,创建一个返回值为实体bean的方法,并在方法体上用@Bean注解,其中方法名称为bean的默认id。


    • 在main()函数中如何调用,使用AnnotationConfigApplicationContext,将配置类传入调用。


    2、包扫描注解@ComponentScan以及包扫描规则

    • 当添加了@ComponentScan注解后,

    @Controller
    @Service
    @Compnent
    @Repository
    以上标签均可以在创建的相应类上使用

    • 在配置类上添加@ComponentScan注解,并定义需要扫描的包路径,如下图:


    • 指定需要扫描或者排除的组件


    • FilterType 指定规则

    FilterType.ANNOTATION :指定过滤注解的组件
    FilterType.ASSIGNABLE_TYPE:按照指定的类型
    FilterType.CUSTOM:自定义过滤规则,需要实现 TypeFilter 接口

    3、@Scope注解的使用

    • Spring默认添加的组件都是单实例的
    • 可以使用@Scope()注解,为注入的bean提供作用域的范围:

    session:同一次session创建一个实例
    request:同一个请求创建一个实例
    prototype:多实例,ioc容器启动时候不会调用方法创建创建对象,而是在
    每次获取的时候才会调用方法创建对象
    singleton:单实例,ioc容器启动的时候就会调用方法创建对象放入ioc容器中,以后每次获取就直接从容器中拿


    4、@Lazy懒加载

    • 单实例bean,默认容器启动的时候就创建对象,
    • 懒加载指的是,容器启动不创建对象,在第一次使用(获取)bean的时候,再去创建对象,并进行初始化


    5、 @Conditional 按照条件给容器中注册bean

    • 按照一定的条件进行判断,满足条件给容器注册bean
    • 获取环境变量:os.name --> 操作系统 的key


    • 创建Conditional的实现类


    • 在实体bean前添加@Conditional注解,满足条件后,才能进行注入


    6、@Import:快速的导入组件,id默认是组件的全类名

    • 直接在配置类上添加@Import(xxx.class),id默认是组件的全类名(使用spring4.0.0版本该注解调用有误,切换成4.3.12)


    • 实现 ImportSelector 接口,返回需要导入的组件的全类名数组



    • 实现 ImportBeanDefinitionRegistrar 接口,手动注册bean到容器中



    7、FactoryBean工厂bean注入spring容器中

    • 实现 FactoryBean 接口,用户可定制化bean的逻辑

    T getObject() 方法,返回由FactoryBean创建的bean实例,如果isSingleton()返回true,则该实例会放到Spring容器中单实例缓存池中;
    boolean isSingleton():返回由BeanFactory创建的bean的作用域是singleton还是prototype;
    Class<T> getObjectType():返回由FactotyBean创建的bean的类型。

    • 要获取工厂bean本身,需要给id前加一个 '&' 标识


    • BeanFactory 与 FactoryBean的区别

    相关文章

      网友评论

        本文标题:Spring源码解析_Spring组件注册

        本文链接:https://www.haomeiwen.com/subject/wxfhwftx.html