美文网首页
springboot2

springboot2

作者: Maoyz | 来源:发表于2019-07-07 22:42 被阅读0次

    一、@ConditionalOnXxx注解

    使用范围

    @Conditional (只有满足一些列条件之后创建一个bean) 标注在类上面,表示该类下面的所有@Bean都会启用配置,也可以标注在方法上面,只是对该方法启用配置。

    @ConditionalOnBean (仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)在判断list的时候,如果list没有值,返回false,否则返回true

    @ConditionalOnMissingBean (仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean) 在判断list的时候,如果list没有值,返回true,否则返回false,其他逻辑都一样

    @ConditionalOnExpression (当表达式为true的时候,才会实例化一个Bean)

    @ConditionalOnClass (某个class位于类路径上,才会实例化一个Bean)

    @ConditionalOnMissingClass (某个class类路径上不存在的时候,才会实例化一个Bean)

    @ConditionalOnNotWebApplication(不是web应用)

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

    二 Environment.resolveRequiredPlaceholders(key)

    获取application.properties的配置内容

        @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和事务@Transactional是不起作用的:例如同一个bean内部方法调用,子类调用父类中有缓存注解的方法等。因为注解调用走的都是增强代理类; 后者不起作用是因为缓存切面必须走代理才有效,这时可以手动使用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并不是增强代理类,事务无效
            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;
            }
        }
    
        /**
         * 内部调用,如果直接使用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();
        }
    

    相关文章

      网友评论

          本文标题:springboot2

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