Spring Boot如何将参数读取逻辑移至独立类并注入主类使用?
实现步骤
1. 创建独立的ConfigurationReader类
在util包下创建ConfigurationReader类,将原main方法中的参数解析逻辑封装进去,并添加@Component注解让Spring管理该类:
package com.yourpackage.util; import org.springframework.stereotype.Component; import java.math.BigInteger; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @Component public class ConfigurationReader { public JobConfiguration parseArgs(String[] args) { JobConfiguration jobConfiguration = new JobConfiguration(); // 解析任务类型 jobConfiguration.setJobType(ProgramJobType.fromValue(args[0])); // 解析触发时间 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); if (!args[1].isEmpty() && args[1].length() >= 20) { jobConfiguration.setTriggerTime(Utility.getFormattedTimeStamp(LocalDateTime.parse(args[1].substring(0, 19), formatter))); } // 解析节目编号 if (!args[2].isEmpty() && args[2].length() >= 7) { jobConfiguration.setProgramNumber(new BigInteger(args[2])); } return jobConfiguration; } }
2. 改造主类实现依赖注入
有两种方式可以在主类中使用ConfigurationReader:
方式一:手动从Spring上下文获取实例
适合需要在main方法启动初期就处理参数的场景:
import com.yourpackage.util.ConfigurationReader; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; @SpringBootApplication public class Mainclass { public static void main(String[] args) throws Exception { // 启动Spring应用并获取上下文 ApplicationContext context = SpringApplication.run(Mainclass.class, args); // 获取ConfigurationReader实例 ConfigurationReader configReader = context.getBean(ConfigurationReader.class); // 调用解析方法生成JobConfiguration JobConfiguration jobConfiguration = configReader.parseArgs(args); // 后续业务逻辑处理 } }
方式二:实现CommandLineRunner接口(推荐)
更符合Spring依赖注入规范,Spring启动后会自动执行run方法:
import com.yourpackage.util.ConfigurationReader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Mainclass implements CommandLineRunner { @Autowired private ConfigurationReader configurationReader; public static void main(String[] args) throws Exception { SpringApplication.run(Mainclass.class, args); } @Override public void run(String[] args) throws Exception { // 调用解析方法生成JobConfiguration JobConfiguration jobConfiguration = configurationReader.parseArgs(args); // 后续业务逻辑处理 } }
3. 注意事项
- 确保
ConfigurationReader所在的util包被Spring扫描到:@SpringBootApplication默认扫描主类所在包及其子包,如果util包是主类包的子包则无需额外配置,否则需要添加@ComponentScan指定扫描范围。 - 如果参数可能为空或格式不正确,建议在
ConfigurationReader中添加参数校验逻辑,避免空指针或格式异常。
内容的提问来源于stack exchange,提问作者Ayush Goyal
相关产品推荐
相关产品推荐

