• spring-context中@Profile注解的源码解析说明


    spring版本为5.0.11

    @Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件

      1) 加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中。默认是default环境
      2) 写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效

    /**
     * Indicates that a component is eligible for registration when one or more
     * {@linkplain #value specified profiles} are active.
     *
     * <p>A <em>profile</em> is a named logical grouping that may be activated
     * programmatically via {@link ConfigurableEnvironment#setActiveProfiles} or declaratively
     * by setting the {@link AbstractEnvironment#ACTIVE_PROFILES_PROPERTY_NAME
     * spring.profiles.active} property as a JVM system property, as an
     * environment variable, or as a Servlet context parameter in {@code web.xml}
     * for web applications. Profiles may also be activated declaratively in
     * integration tests via the {@code @ActiveProfiles} annotation.
     *
     * <p>The {@code @Profile} annotation may be used in any of the following ways:
     * <ul>
     * <li>as a type-level annotation on any class directly or indirectly annotated with
     * {@code @Component}, including {@link Configuration @Configuration} classes</li>
     * <li>as a meta-annotation, for the purpose of composing custom stereotype annotations</li>
     * <li>as a method-level annotation on any {@link Bean @Bean} method</li>
     * </ul>
     *
     * <p>If a {@code @Configuration} class is marked with {@code @Profile}, all of the
     * {@code @Bean} methods and {@link Import @Import} annotations associated with that class
     * will be bypassed unless one or more of the specified profiles are active. A profile
     * string may contain a simple profile name (for example {@code "p1"}) or a profile
     * expression. A profile expression allows for more complicated profile logic to be
     * expressed, for example {@code "p1 & p2"}. See {@link Profiles#of(String...)} for more
     * details about supported formats.
     *
     * <p>This is analogous to the behavior in Spring XML: if the {@code profile} attribute of
     * the {@code beans} element is supplied e.g., {@code <beans profile="p1,p2">}, the
     * {@code beans} element will not be parsed unless at least profile 'p1' or 'p2' has been
     * activated. Likewise, if a {@code @Component} or {@code @Configuration} class is marked
     * with {@code @Profile({"p1", "p2"})}, that class will not be registered or processed unless
     * at least profile 'p1' or 'p2' has been activated.
     *
     * <p>If a given profile is prefixed with the NOT operator ({@code !}), the annotated
     * component will be registered if the profile is <em>not</em> active &mdash; for example,
     * given {@code @Profile({"p1", "!p2"})}, registration will occur if profile 'p1' is active
     * or if profile 'p2' is <em>not</em> active.
     *
     * <p>If the {@code @Profile} annotation is omitted, registration will occur regardless
     * of which (if any) profiles are active.
     *
     * <p><b>NOTE:</b> With {@code @Profile} on {@code @Bean} methods, a special scenario may
     * apply: In the case of overloaded {@code @Bean} methods of the same Java method name
     * (analogous to constructor overloading), an {@code @Profile} condition needs to be
     * consistently declared on all overloaded methods. If the conditions are inconsistent,
     * only the condition on the first declaration among the overloaded methods will matter.
     * {@code @Profile} can therefore not be used to select an overloaded method with a
     * particular argument signature over another; resolution between all factory methods
     * for the same bean follows Spring's constructor resolution algorithm at creation time.
     * <b>Use distinct Java method names pointing to the same {@link Bean#name bean name}
     * if you'd like to define alternative beans with different profile conditions</b>;
     * see {@code ProfileDatabaseConfig} in {@link Configuration @Configuration}'s javadoc.
     *
     * <p>When defining Spring beans via XML, the {@code "profile"} attribute of the
     * {@code <beans>} element may be used. See the documentation in the
     * {@code spring-beans} XSD (version 3.1 or greater) for details.
     *
     * @author Chris Beams
     * @author Phillip Webb
     * @author Sam Brannen
     * @since 3.1
     * @see ConfigurableEnvironment#setActiveProfiles
     * @see ConfigurableEnvironment#setDefaultProfiles
     * @see AbstractEnvironment#ACTIVE_PROFILES_PROPERTY_NAME
     * @see AbstractEnvironment#DEFAULT_PROFILES_PROPERTY_NAME
     * @see Conditional
     * @see org.springframework.test.context.ActiveProfiles
     */
    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Conditional(ProfileCondition.class)
    public @interface Profile {
    
        /**
         * The set of profiles for which the annotated component should be registered.
         */
        String[] value();
    
    }

    @Profile现在用的很少,配置环境

    三种设置方式:

    • 可以通过ConfigurableEnvironment.setActiveProfiles()以编程的方式激活

    • 可以通过AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME (spring.profiles.active )属性设置为

      JVM属性

    • 作为环境变量,或作为web.xml 应用程序的Servlet 上下文参数。也可以通过@ActiveProfiles 注解在集成测试中以声明方式激活配置文件。

  • 相关阅读:
    [转]开源游戏AI引擎列表与游戏中的人工智能
    [转]刨根问底!曲面细分技术到底是个啥?
    [转]link time code generation
    [转]PythonQt
    [转]Free Game Development Libraries
    Java虚拟机(二):垃圾回收算法 时间
    Java虚拟机(一):JVM的运行机制 时间
    Java虚拟机(四):常用JVM配置参数 时间
    Java虚拟机(三):垃圾收集器 时间
    mov offset和lea的区别
  • 原文地址:https://www.cnblogs.com/mufeng07/p/12202037.html
Copyright © 2020-2023  润新知