Spring Boot:跨包使用@Value读取application.properties异常问题
问题原因及解决办法
核心原因
Spring Boot默认只会扫描@SpringBootApplication注解所在包(此处为com.test.pkg1)及其子包下的类,将它们纳入Spring容器管理。com.test.pkg2与com.test.pkg1是同级包,不在默认扫描范围内,因此pkg2中的类未被Spring接管,@Value注解不会被解析,直接输出占位符文本。
解决办法
方法1:调整包结构
将com.test.pkg2修改为com.test.pkg1.pkg2,使其成为pkg1的子包,Spring默认扫描即可覆盖该包,无需额外配置。
方法2:手动指定扫描范围
在带有@SpringBootApplication的类上,通过scanBasePackages属性明确指定要扫描的包:
@SpringBootApplication(scanBasePackages = {"com.test.pkg1", "com.test.pkg2"}) public class YourSpringBootApplication { public static void main(String[] args) { SpringApplication.run(YourSpringBootApplication.class, args); } }
也可通过scanBasePackageClasses指定包内的类来间接设置扫描范围:
@SpringBootApplication(scanBasePackageClasses = {Pkg1DemoClass.class, Pkg2DemoClass.class})
方法3:确保pkg2的类是Spring组件
无论采用哪种扫描方式,pkg2中的类必须添加Spring组件注解(如@Component、@Service、@Controller、@Repository),只有被Spring实例化为Bean的类,@Value注解才会生效。示例:
@Component public class Pkg2DemoClass { @Value("${prop_name}") private String propValue; // 业务代码 }
内容的提问来源于stack exchange,提问作者Desenfoque
相关产品推荐
相关产品推荐

