@Scope注解,@Conditional()注解

导读:本篇文章讲解 @Scope注解,@Conditional()注解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

@Configuration
public class MyConfig {
    
    /**    需要下载Scope的源码可以看到;
     *      * @since 4.2
     *      * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE  prototype  所实例的
     *      * @see ConfigurableBeanFactory#SCOPE_SINGLETON  singleton  单实例的
     *      * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST   request  同一次请求创建一个实例
     *      * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION   session  同一次session创建一个实例
     *      * @see #value
     * @return
     *
     * prototype  多实例的,ioc容器启动并不会去调用方法创建对象放在容器中。
     *                      每次获取的时候才会调用方法创建对象;
     * singleton  单实例的,ioc容器启动会调用方法创建对象放到ioc容器中。
     *                      以后每次获取就是直接从容器(map.get())中拿,
     *
     * request  同一次请求创建一个实例
     * session  同一次session创建一个实例
     *
     * 懒加载:@Lazy
     *      单实例Bean:默认在容器中启动的时候 创建对象;
     *      懒加载:容器启动不创建对象,第一次使用(getbean时)bean创建对象;并初始化;

* 1、单实例bean在Spring容器启动的时候就会被创建,并且还加载到Spring容器中去了
* 2、在对象是懒加载的时候,获取bean对象的时候,创建出了bean对象并加载到Spring容器

     *
     */

    @Bean
//    @Scope("prototype")
    @Lazy
    public Person person(){
        return new Person();
    }
}

Spring在启动时,默认会将单实例bean进行实例化,并加载到Spring容器中去。也就是说,单实例bean默认是在Spring容器启动的时候创建对象,并且还会将对象加载到Spring容器中。如果我们需要对某个bean进行延迟加载,那么该如何处理呢?此时,就需要使用到@Lazy注解了。

懒加载:

什么是懒加载;
何为懒加载呢?懒加载就是Spring容器启动的时候,先不创建对象,在第一次使用(获取)bean的时候再来创建对象,并进行一些初始化。

懒加载,也称延时加载,仅针对单实例bean生效。 单实例bean是在Spring容器启动的时候加载的,添加@Lazy注解后就会延迟加载,在Spring容器启动的时候并不会加载,而是在第一次使用此bean的时候才会加载,但当你多次获取bean的时候并不会重复加载,只是在第一次获取的时候才会加载,这不是延迟加载的特性,而是单实例bean的特性。

四、@Conditional()注解

@Conditional注解可以按照一定的条件进行判断,满足条件向容器中注册bean,不满足条件就不向容器中注册bean。

@Conditional注解是由Spring Framework提供的一个注解,它位于 org.springframework.context.annotation包内,定义如下。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {

   /**
    * All {@link Condition Conditions} that must {@linkplain Condition#matches match}
    * in order for the component to be registered.
    */
   Class<? extends Condition>[] value();

}

从@Conditional注解的源码来看,@Conditional注解不仅可以添加到类上,也可以添加到方法上。在@Conditional注解中,还存在着一个Condition类型或者其子类型的Class对象数组,Condition是个啥呢?我们点进去看一下。


@FunctionalInterface
public interface Condition {

   /**
    * Determine if the condition matches.
    * @param context the condition context
    * @param metadata metadata of the {@link org.springframework.core.type.AnnotationMetadata class}
    * or {@link org.springframework.core.type.MethodMetadata method} being checked
    * @return {@code true} if the condition matches and the component can be registered,
    * or {@code false} to veto the annotated component's registration
    */
   boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);

}

可以看到,它是一个接口。所以,我们使用@Conditional注解时,需要写一个类来实现Spring提供的Condition接口,它会匹配@Conditional所符合的方法,然后我们就可以使用我们在@Conditional注解中定义的类来检查了。
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/71824.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!