@Scope注解,@Conditional()注解

@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注解中定义的类来检查了。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值