springboot2

一、@ConditionalOnXxx注解

使用范圍

@Conditional (只有滿足一些列條件之后創(chuàng)建一個bean) 標注在類上面,表示該類下面的所有@Bean都會啟用配置,也可以標注在方法上面,只是對該方法啟用配置。

@ConditionalOnBean (僅僅在當前上下文中存在某個對象時,才會實例化一個Bean)在判斷l(xiāng)ist的時候,如果list沒有值,返回false,否則返回true

@ConditionalOnMissingBean (僅僅在當前上下文中不存在某個對象時,才會實例化一個Bean) 在判斷l(xiāng)ist的時候,如果list沒有值,返回true,否則返回false,其他邏輯都一樣

@ConditionalOnExpression (當表達式為true的時候,才會實例化一個Bean)

@ConditionalOnClass (某個class位于類路徑上,才會實例化一個Bean)

@ConditionalOnMissingClass (某個class類路徑上不存在的時候,才會實例化一個Bean)

@ConditionalOnNotWebApplication(不是web應(yīng)用)

@ConditionalOnProperty(name = "swagger.enabled", matchIfMissing = true)

二 Environment.resolveRequiredPlaceholders(key)

獲取application.properties的配置內(nèi)容

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface RocketMQMessageListener {

        String NAME_SERVER_PLACEHOLDER = "${rocketmq.name-server:}";
    }

    獲取屬性值:
    applicationContext.getEnvironment().
                      resolveRequiredPlaceholders(rocketMQMessageListener.customizedTraceTopic())

三 引用other.properties文件

@ImportResource(locations = {"classpath:other.properties"})

四 注解@Cacheable 和@Transactional 失效原因

在有些情形下注解式緩存@Cacheable和事務(wù)@Transactional是不起作用的:例如同一個bean內(nèi)部方法調(diào)用,子類調(diào)用父類中有緩存注解的方法等。因為注解調(diào)用走的都是增強代理類; 后者不起作用是因為緩存切面必須走代理才有效,這時可以手動使用CacheManager來獲得緩存效果。

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void save() {
        userRepository.deleteById(1L);
        int i = 1 / 0;
        UserPO userPO = new UserPO("aaaa", "1");
    }

    @Override
    public void execute() {
        // 相當于this.save(),this并不是增強代理類,事務(wù)無效
        save();
    }

解決辦法一:ApplicationContext

    @Component
    public class ApplicationContextHolder implements ApplicationContextAware {

        protected static final Logger logger = LoggerFactory.getLogger(ApplicationContextHolder.class);

        private static ApplicationContext applicationContext;

        public static ApplicationContext getContext() {
            return applicationContext;
        }

        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            ApplicationContextHolder.applicationContext = applicationContext;
        }
    }

    /**
     * 內(nèi)部調(diào)用,如果直接使用getMenuList(),相當于this.getMenuList(),不走增強代理
     * <p>
     * 方法一 ApplicationContext
     */
    public List<String> getRecommendsWithContext() {
        MenuService proxy = ApplicationContextHolder.getContext().getBean(getClass());
        return proxy.save();
    }

解決方法二:AopContext


    /**
     * 方法二 AopContext.currentProxy()
     */
    public List<String> getRecommendsWithAopContext() {
        // java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.
        // 解決辦法 @EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true),默認值都是false
        return ((MenuService) AopContext.currentProxy()).getMenuList();
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容