当前位置: 首页 > 知识库问答 >
问题:

从自动配置创建Autowireable@beans

云俊美
2023-03-14

相关的:

    null
  • 通过spring配置来配置bean的数量;
  • 通过@configurationproperties获取此配置;
  • 从自动配置模块根据所述配置创建并注入@beans;
  • 能够@autowire在应用程序中创建bean。

示例:使通过spring配置声明基于咖啡因的缓存@beans的数量成为可能。以下是基于类似问题的公认答案的实现:

首先,引导自动配置模块:

@Component
@ConfigurationProperties
@Data
public class Props {

    private LocalCacheConf cache = new LocalCacheConf();

    @Data
    public static class LocalCacheConf {

        /**
        * List of caches to create, with accompanying configuration.
        */
        private List<CacheDef> caches = new ArrayList<>();

        @Data
        public static class CacheDef {

            private String name;
            private CaffeineCacheConf properties;
        }

        @Data
        public static class CaffeineCacheConf {

            private long maximumSize = -1;
        }
    }
}


@Configuration
@Slf4j
public class LocalCacheConfig implements BeanFactoryAware {

    @Autowired private Props props;
    @Setter private BeanFactory beanFactory;
    private CaffeineCacheManager localCacheManager;

    @PostConstruct
    public void configure() {
        setCacheManager();
        createCaches( props.getCache() );
    }

    private void createCaches( LocalCacheConf locCacheConf ) {
        ConfigurableBeanFactory configurableBeanFactory = (ConfigurableBeanFactory) beanFactory;

        for ( CacheDef cacheProps : locCacheConf.getCaches() ) {
            Cache cache = createAndConfigureCache(
                    cacheProps.getName(),
                    cacheProps.getProperties()
            );
            configurableBeanFactory.registerSingleton( cacheProps.getName(), cache );
        }
    }

    private Cache createAndConfigureCache( String name, CaffeineCacheConf props ) {
        Caffeine<Object, Object> c = Caffeine.newBuilder().recordStats();

        if ( props.getMaximumSize() >= 0 ) {
            c.maximumSize( props.getMaximumSize() );
        }
        // can extend config to include additional properties

        localCacheManager.setCaffeine( c );
        log.info( "building [{}] cache with config: [{}]", name, c.toString() );

        return localCacheManager.getCache( name );
    }

    private void setCacheManager() {
        log.info( "creating {}...", "localCacheManager" );
        localCacheManager = new CaffeineCacheManager();
        ( (ConfigurableBeanFactory) beanFactory )
                .registerSingleton( "localCacheManager", localCacheManager );
    }
}
cache:
  caches:
    - name: c1
      properties:
        maximumSize: 50
    - name: c2
      properties:
        maximumSize: 5000

共有1个答案

范翰海
2023-03-14

如果这是一个Spring Boot项目,请查看:

https://docs.spring.io/spring-boot/docs/current-snapshot/reference/html/boot-features-caching.html#boot-features-caching-provider-caffeine

 类似资料:
  • 如果您在开发共享库的公司工作,或者您在开源或商业库中工作,则可能需要开发自己的自动配置。 自动配置类可以捆绑在外部jar中,仍然可以通过Spring Boot获取。 自动配置可以与“启动器”相关联,该“启动器”提供自动配置代码以及您将使用它的典型库。 我们首先介绍了构建自己的自动配置需要了解的内容,然后我们将继续介绍创建自定义启动器所需的典型步骤。 可以使用演示项目来展示如何逐步创建启动器。 4.

  • 背景墙 我有一个环回和Angular应用程序,环回使用服务器模型和api,并使用它的sdk我们能够获得客户端服务。 现在我计划使用gulp自动执行以下构建过程。如果在模型中进行了任何更改,则运行sdk命令并重新启动服务器/其次,当对角度文件进行任何更改时,将运行sdk文件并从angular dist文件夹获取文件并重新启动服务器,最好我们可以使用浏览器的实时重新加载。 这是我尝试过的,但似乎从未奏

  • 您的帮助应该是值得赞赏的,如果需要,我将提供代码示例。

  • 问题内容: 有时我从那里下载python源代码,却不知道如何安装所有依赖项。如果没有文件,则必须手动创建。问题是:给定python源代码目录,是否可以从import部分自动创建? 问题答案: 如果使用虚拟环境,就可以了。 IF NOT ,pigar将是您不错的选择。 顺便说一句,我不确定它是否可以在2.6下使用。 更新 : 建议使用Pipenv或其他工具来改善您的开发流程。 对于 Python 3

  • 有时我从下载python源代码,但不知道如何安装所有依赖项。如果没有文件,我必须手工创建它。问题是:给定python源代码目录,是否可以从import部分自动创建?

  • 16. 自动配置 Spring Boot的自动配置机制尝试根据所添加的jar依赖来自动配置您的Spring程序。例如,如果HSQLDB在您的类路径上,而且您尚未手动配置任何数据库连接bean,那么我们会自动配置一个内存数据库。 您需要通过将@EnableAutoConfiguration或@SpringBootApplication注解添加到一个@Configuration类来激活自动配置。 应当