SpringBoot 在main或者普通类中条用service接口

本文介绍如何在SpringBoot项目中使用SpringUtils工具类,实现在main方法或其他类中调用MyBatis的service接口进行数据库操作。通过创建SpringUtil工具类,实现ApplicationContext的获取及Bean的注入,便于在不同场景下对MyBatis进行测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot 在main或者普通类中条用service接口,对MyBatis进行测试

首先创建一个工具类 SpringUtils
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext = null;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if(SpringUtil.applicationContext == null){
            SpringUtil.applicationContext  = applicationContext;
        }
    }
    
    //获取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
    //通过name获取 Bean.
    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }

    //通过class获取Bean.
    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }

    //通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name,Class<T> clazz){
        return getApplicationContext().getBean(name, clazz);
    }
}
在main方法或者其他类上进行调用该类数据
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class EtlOffLine {
    @Scheduled(cron = "0/5 * * * * ?")
    public void EtlOffLineMain(){
        ApplicationContext context = SpringUtil.getApplicationContext();
        EtlMonitorOffLineService bean = context.getBean(EtlMonitorOffLineService.class);
        System.out.println("bean.EtlMonitorOffLineService() = " + bean.EtlMonitorOffLineService());
    }

}

<think>好的,我现在需要帮用户解决如何用Python的正则表达式从字符串“共 10648 条”中提取条数的问题。首先,我得分析用户的需求。用户提供的例子是一个中文句子,其中包含数字和单位“条”。用户的目标是提取其中的数字部分,也就是10648。 首先,我得确认用户对正则表达式的熟悉程度。用户可能已经了解基本的正则表达式,但可能需要指导如何正确编写模式来匹配这种情况。用户的需求很明确,但可能还有其他类似的情况需要考虑,比如数字可能有千分位分隔符,或者数字的位置在字符串中的其他位置。不过根据例子来看,用户提供的字符串结构是固定的,即“共”后面跟着空格,然后是数字,接着是“条”。 接下来,我需要考虑如何构造正则表达式。在中文环境下,数字通常以连续的数字字符出现,所以使用\d+来匹配一个或多个数字是合适的。但是需要确保正则表达式能准确匹配到数字的位置,而不会误匹配其他部分。 可能的步骤是: 1. 导入re模块。 2. 定义字符串,例如s = "共 10648 条"。 3. 编写正则表达式模式,匹配“共”后面的数字部分。 4. 使用re.search或re.findall来提取匹配的数字。 5. 将提取到的字符串转换为整数。 考虑到字符串中的结构,正则表达式可以写成r'共\s*(\d+)',其中\s*匹配“共”和数字之间可能的空格(可能有多个空格或没有),(\d+)捕获数字部分。但用户例子中的空格是一个,所以也可以写成\s+。不过为了更通用,使用\s*可能更安全,以应对可能的多个空格或没有空格的情况。 另外,用户可能希望确保“条”出现在数字后面,但根据例子,可能不需要严格匹配“条”,因为用户可能只需要数字部分。但为了精确,可以加上“条”的存在,如r'共\s*(\d+)\s*条',这样会更准确,避免匹配到其他位置的数字。 测试不同的情况是否有必要,比如是否有其他数字在字符串中,但根据用户提供的例子,结构比较固定,所以不需要太复杂的处理。不过,加入对“条”的匹配可以增加准确性。 然后,考虑使用re.search来查找第一个匹配项,然后通过group(1)获取捕获组的内容。或者使用re.findall直接获取所有匹配的数字,但在这个例子中,应该只有一个数字。 可能遇到的错误包括:未考虑到空格的存在,或者数字部分包含其他字符(如逗号分隔的千分位),但根据例子,数字是连续的,所以不需要处理这种情况。不过用户可能需要更通用的解决方案,比如处理“共10,648条”这样的情况,这时候正则表达式需要允许逗号的存在,如r'共\s*([\d,]+)\s*条',然后再去除逗号。但用户的问题中没有提到这种情况,所以可能不需要。 最后,将提取到的字符串转换为整数,完成需求。 总结步骤: 1. 导入re模块。 2. 定义字符串。 3. 使用正则表达式匹配数字部分。 4. 提取并转换数字。 5. 处理可能的异常情况,比如没有匹配到的情况。 可能的代码示例: import re s = "共 10648 条" match = re.search(r'共\s*(\d+)\s*条', s) if match: count = int(match.group(1)) print(count) else: print("未找到匹配的条数") 这样,用户可以得到正确的数字,并且代码有一定的健壮性,处理没有匹配到的情况。 另外,可能需要考虑其他变体,例如“共计10648条记录”这样的情况,这时候正则表达式可能需要调整,但用户的问题中例子比较明确,可能不需要扩展到这种情况。但用户可能希望知道如何调整正则表达式以适应不同的情况,所以可以简要说明如何修改模式。 总的来说,关键点在于正确构造正则表达式,准确捕获数字部分,并处理可能的空格和结构变化。确保代码的健壮性和准确性,同时提供清晰的解释,帮助用户理解和应用解决方案。</think>--- ### **Python 正则提取“共 10648 条”中的条数** 通过正则表达式从类似 `"共 10648 条"` 的字符串中提取数字(如 `10648`),需明确 **数字的位置** 和 **正则匹配规则**。以下是具体方法和代码示例: --- ### **一、正则表达式设计** #### 1. **明确目标字符串结构** 字符串格式为:`"共 XXXX 条"`(`XXXX` 为数字),需提取 `XXXX`。 关键点: - `共` 和 `条` 是固定文本 - 数字位于两者之间,可能包含空格(如 `共 123 条` 或 `共123条`) #### 2. **正则表达式规则** - `共` → 匹配字面量 `共` - `\s*` → 匹配 `共` 和数字之间的 **零或多个空格** - `(\d+)` → 匹配 **一个或多个连续数字**(`\d` 表示数字,`+` 表示至少一次) - `\s*条` → 匹配数字后的 **零或多个空格 + 条** 完整正则表达式: ```python r'共\s*(\d+)\s*条' ``` --- ### **二、代码实现** ```python import re # 原始字符串 text = "共 10648 条" # 使用正则匹配 match = re.search(r'共\s*(\d+)\s*条', text) if match: count = int(match.group(1)) # 提取第一个捕获组(即数字) print(count) # 输出:10648 else: print("未找到匹配的条数") ``` #### **关键说明** - `re.search()`:扫描整个字符串查找匹配项 - `match.group(1)`:提取正则中 `(\d+)` 捕获的数字(`group(0)` 返回完整匹配结果) - `int()`:将字符串数字转为整数 --- ### **三、扩展场景处理** #### 1. **处理千分位分隔符** 若数字含逗号(如 `"共 10,648 条"`),需调整正则表达式: ```python r'共\s*([\d,]+)\s*条' # 允许匹配含逗号的数字 ``` 提取后需移除逗号再转整数: ```python count_str = match.group(1).replace(',', '') count = int(count_str) ``` #### 2. **处理多语言场景** 若字符串为英文(如 `"Total 10648 items"`),正则调整为: ```python r'Total\s*(\d+)\s*items' ``` --- ### **四、常见问题与解决** | **问题** | **解决方案** | |------------------------|-----------------------------------------------------------------------------| | 正则未匹配到数字 | 检查字符串是否含隐藏字符(如全角空格 ` `),改用 `r'共\s*(\d+)\s*条'` | | 数字含其他符号(如逗号)| 调整正则表达式为 `r'共\s*([\d,]+)\s*条'`,并清理符号后转换类型 | | 多组数字干扰 | 限定正则范围,如添加边界符 `r'^共\s*(\d+)\s*条$'`(仅匹配以 `共` 开头、`条` 结尾的字符串) | --- ### **五、总结** | **步骤** | **操作** | |------------------|---------------------------------------------| | 正则表达式设计 | 明确固定文本与数字位置,用 `\d+` 捕获数字 | | 提取与转换 | 使用 `group(1)` 获取捕获组,转为整数 | | 处理特殊格式 | 扩展正则表达式兼容千分位、多语言等场景 | 通过正则表达式可高效提取结构化文本中的数字数据。若需处理复杂场景(如动态文本、非固定格式),建议结合其他解析方法(如 `BeautifulSoup` 或 `XPath`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值