`

Spring加载自定义配置文件内容

 
阅读更多

一:bean的XML配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="restfulBean" class="com.hyxt.restful.registry.RestfulBean" init-method="start">
        <property name="zkClient" ref="zkClient"/>
        <property name="root" value="restfulCommand"/>
        <property name="businessMap">
            <map>
                <!--<entry key="cashCommand" value="http://{server}:8082/posRequest/forPosApi/posMutual"/>
             <entry key="cashCommand1" value="http://{server}:8080/demoPrj/rest/demo1"/>
              <entry key="cashCommand2" value="http://{server}:8080/demoPrj/rest/demo2"/>-->
            </map>
        </property>
    </bean>
    <!-- 引入zookeeper client bean -->
    <import resource="zookeeper.xml"/>
</beans>

二:Bean实现类如下:

public class RestfulBean implements Restful {

    private Logger logger = LoggerFactory.getLogger(RestfulBean.class);

    private String root;
    private Map<String,String> businessMap;
    protected ZkClient zkClient;

    public String getRoot() {
        return root;
    }

    public void setRoot(String root) {
        this.root = root;
    }

    public Map<String, String> getBusinessMap() {
        return businessMap;
    }

    public void setBusinessMap(Map<String, String> businessMap) {
        this.businessMap = businessMap;
    }

    public ZkClient getZkClient() {
        return zkClient;
    }

    public void setZkClient(ZkClient zkClient) {
        this.zkClient = zkClient;
    }

    public void start() {
        if(root==null||"".equals(root)){
            throw new RuntimeException("没有定义根节点");
        }
        if(businessMap==null){
            throw new RuntimeException("没有定义restful服务");
        }

        try {
            for (String businessKey : businessMap.keySet()){
                String url = businessMap.get(businessKey);
                url = url.replace("{server}", NetUtils.getLocalHost());
                url = URLEncoder.encode(url, "UTF-8");
                String path = ZKPaths.makePath(root, businessKey, url);
                //不管有没有,先删除掉再开始发布
                try{
                    zkClient.deletePath(path);
                }catch (Exception e){
                    ;
                }
                zkClient.createPath(path, CreateMode.EPHEMERAL);
                logger.info("发布reftful服务[{}]: {} 成功",businessKey,url);
            }
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(),e);
        }
    }

    @Override
    public List<String> getRestUrls(String businessKey) {
        try{
            List<String> children = zkClient.getChildren(ZKPaths.makePath(root, businessKey));
            return Lists.transform(children, new Function<String, String>() {
                @Override
                public String apply(String s) {
                    try {
                        return URLDecoder.decode(s, "UTF-8");
                    } catch (UnsupportedEncodingException e) {
                        throw new RuntimeException(e.getMessage(), e);
                    }
                }
            });
        }catch (Exception e){
            logger.error(e.getMessage(),e);
            return null;
        }
    }

    @Override
    public String getRestUrl(String businessKey) {
        try{
            List<String> restUrls = getRestUrls(businessKey);
            if (restUrls != null&&restUrls.size()>0) {
                return restUrls.get(new Random().nextInt(restUrls.size()));
            }
        }catch (Exception e){
            logger.error(e.getMessage(),e);
        }
        return null;
    }

    @Override
    public void listener(final String businessKey, final RestfulListener listener) {
        try{
            zkClient.pathListener(ZKPaths.makePath(root, businessKey), new PathChildrenCacheListener() {
                @Override
                public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
                    listener.childChange(businessKey);
                }
            });
        }catch (Exception e){
            logger.error(e.getMessage(),e);
        }
    }

}

三:初始化时加载配置文件,如test.xml

分享到:
评论

相关推荐

    Spring@PropertySource 配置文件自定义加密、自定义Yaml文件加载

    Spring@PropertySource 配置文件自定义加密、自定义Yaml文件加载

    YAMLDemo:Spring Boot 2.0获取自定义YAML配置Demo

    YAMLDemo Spring Boot 2.0获取自定义YAML配置Demo 使用YamlPropertySourceLoader加载自定义YAML配置文件

    Spring 自定义注解注入properties文件的值jar包

    在xml配置文件中,这样加载properties文件 &lt;bean id="propertyConfigurer" class="com.better517na.propertiesComponent.business.ExtendedPropertyPlaceholderConfigurer"&gt; &lt;value&gt;classpath:...

    Rkt_Config:允许在 Magento 应用程序中使用自定义配置文件的 Magento 扩展

    Rkt_Config - Magento 扩展这个 Magento 扩展将允许我们在 Magento 中使用自定义配置文件。 配置文件是 XML 文件,通常用于进行一些配置设置。 默认情况下,驻留在 Magento 模块/etc目录中的config.xml文件用于保存...

    multi-properties:SpringBoot引入多个配置文件

    1.自定义EnvironmentPostProcessor的实现类,在回调中加载自定义的配置文件 2.在META-INF/spring.factories中添加配置: org.springframework.boot.env.EnvironmentPostProcessor=...

    Spring框架生态流程框架图-执行运行路程图

    配置加载:Spring框架会读取并加载应用程序的配置文件,例如XML配置文件或基于注解的配置类。 依赖注入:Spring框架使用依赖注入(Dependency Injection)机制来管理组件之间的依赖关系。它会通过配置或注解获取...

    springboot通过@Condition注解类型完成加载配置内容

    通过@Bean和@Condition 注解自定义对于的condition里面根据自定义的条件实现指定类注入到spring中;@ConditionalOnProperty可以根据配置文件中的 属性值不同将不同的类注入到spring中 该资源中案例完整,代码简单移动

    从零开始学Spring Boot

    1.32 Spring boot 文件上传(多文件上传) 1.33 导入时如何定制spring-boot依赖项的版本 1.34 Spring Boot导入XML配置 1.35 Spring Boot使用@SpringBootApplication注解 1.36 Spring Boot 监控和管理生产环境 1.37 ...

    springboot知识点整理

    2.9 配置文件的加载位置 33 2.10 外部配置加载顺序 36 2.11 自动配置原理 37 2.12 @Conditional派生注解 41 3 Spring Boot与日志 42 3.1 日志框架分类和选择 42 3.2 SLF4j使用 43 3.3 其他日志框架统一转换成slf4j+...

    Spring Boot中文文档.rar

    配置文件特定的配置文件 26.记录 26.1.日志格式 26.2.控制台输出 26.2.1.彩色编码输出 26.3.文件输出 26.4.日志级别 26.5.日志组 26.6.自定义日志配置 26.7.Logback Extensions 26.7....

    Spring.net框架

    从中我们可以看出,我们实现了一个IocInCSharp.ConfigHandler类,用来处理配置文件中IocInCSharp\ objects结点中的内容。ConfigHandler类将根据该结点下的内容处理并创建一ConfigInfo对象(关于ConfigInfo、 ...

    struts1.2+spring2.0+hibernate3.1框架整合实例

    采用在web.xml中加载spring配置文件的方法降低struts和spring的耦合度,使用自定义的MyDelegatingRequestProcessor类来代替spring的DelegatingRequestProcessor类来解决spring中action的bean的重复配置问题。...

    Spring高级之注解驱动开发视频教程

    n 高级特性-自定义PropertySourceFactory实现解析yaml配置文件 n 源码分析-BeanFactory类视图和常用工厂说明 n 源码分析-AnnotationConfigApplicationContext的register方法 n 源码分析-...

    Spring.3.x企业应用开发实战(完整版).part2

    2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 2.3.2 UserDao 2.3.3 LoginLogDao 2.3.4 在Spring中装配DAO 2.4 业务层 2.4.1 UserService 2.4.2 在Spring中装配Service 2.4.3 单元测试 2.5 展现层 ...

    spring security 参考手册中文版

    38. Spring Data&Spring安全配置 273 39. @Query中的安全表达式 273 第八部分 附录 274 40.安全数据库模式 274 40.1用户模式 274 40.1.1集团当局 274 40.2持久登录(记得我)架构 275 40.3 ACL模式 275 40.3.1 ...

    Spring攻略(第二版 中文高清版).part1

    1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 解决构造程序歧义 17 ...

    Spring中文帮助文档

    6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入...

    Spring API

    6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入...

    Spring攻略(第二版 中文高清版).part2

    1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 解决构造程序歧义 17 ...

    JCL:Jar Class Loader,一个可配置的动态自定义类加载器,旨在在IoC框架和Web应用程序中创建,管理和操作隔离的Java类加载器。

    JCL是可配置,动态和可扩展的自定义类加载器,可直接从Jar文件和其他来源加载Java类。 这样做的动机是创建隔离的类加载器,该类加载器可以轻松地与IoC框架(如Spring)和Web应用程序集成。 整个库,包括其代码库和...

Global site tag (gtag.js) - Google Analytics