从非组件类(如pojo或singleton)中读取application.properties

rah*_*l s 5 java spring spring-boot

我正在使用spring boot&作为属性,我已将application.properties放置在src / main / resources中

从@Controllers和@Services,我能够读取属性,但是从我的模型pojo和singleton类中,我无法读取值。

我的@SpringBootApplication位于com.vehicle中,并且我没有覆盖@ComponentScan,所以我相信它应该读取所​​有基础包。

下面是代码:

application.properties

vehicle.lift.maxWeight=10
vehicle.lift.error.overWeight=Overweight

vehicle.battery.default=5.0
vehicle.battery.critical.limit=15
vehicle.walk.distance.error=Not able to move
Run Code Online (Sandbox Code Playgroud)

WalkServiceImpl.java(可从此处阅读)

package com.vehicle.prototype.service.impl;

@Service
public class WalkServiceImpl implements CapabilityService {

    @Value("${vehicle.walk.distance.error}")
    private String mDistanceError;

    @Override
    public void performTask(VehicleData vehicleData) {
        double distance = vehicleData.getWalkingDistance();
        double remainingBattery = vehicleData.getRemainingBattery();

        if (remainingBattery < distance) {
            vehicleData.setErrorMessage(mDistanceError);
            System.out.println(mDistanceError);
        } else {
            vehicleData.setRemainingBattery(remainingBattery - distance);
        }

        VehicleUtil.checkBatteryStatus(vehicleData);

    }

}
Run Code Online (Sandbox Code Playgroud)

VehicleData.javaPojo-无法从此处读取)

package com.vehicle.prototype.model;

public class VehicleData {

    private double walkingDistance;
    private double liftWeight;

    @Value("${vehicle.battery.default}")
    private double remainingBattery;

    // setters & getters ....

}
Run Code Online (Sandbox Code Playgroud)

VehicleUtil.java(Singleton-无法从此处读取)

package com.vehicle.prototype.utils;

public class VehicleUtil {

    private static VehicleUtil mInstance = null;
    private static Object mLock = new Object();

    @Value("${vehicle.battery.critical.limit}")
    private static double mCriticalLimit;

    @Value("${vehicle.battery.default}")
    private static double mTotalPower;

    @Value("${vehicle.battery.critical.warning}")
    private static String powerWarning;


    private VehicleUtil() {
        // empty private constructor.
    }

    public static VehicleUtil getInstance() {
        if (mInstance == null) {
            synchronized (mLock) {
                if (mInstance == null)
                    mInstance = new VehicleUtil();
            }
        }
        return mInstance;
    }

    public static void checkBatteryStatus(VehicleData vehicleData) {
        double criticalMark = (mCriticalLimit * 100.0f) / mTotalPower;
        if (vehicleData.getRemainingBattery() < criticalMark) {
            vehicleData.setBatteryCritical(Boolean.TRUE);
            System.out.println(powerWarning);
        } else {
            vehicleData.setBatteryCritical(Boolean.FALSE);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

请让我知道如何解决此问题。

谢谢

ale*_*xbt 5

您需要将属性注入到 spring 管理的 bean 中。您可以做的是将属性捆绑在这样的 bean 中(请参阅文档

@ConfigurationProperties(prefix="vehicle")
public class VehicleProperties {
    @Value("${battery.critical.limit}")
    private double mCriticalLimit;

    @Value("${battery.default}")
    private double mTotalPower;

    @Value("${battery.critical.warning}")
    private String powerWarning;
}
Run Code Online (Sandbox Code Playgroud)

然后,将车辆属性注入到您的服务中并将它们传递给 VehicleUtil:

public class WalkServiceImpl {
    @Autowired
    private VehicleProperties vehicleProperties;

    @Override
    public void performTask(VehicleData vehicleData) {
        ...
        VehicleUtil.checkBatteryStatus(vehicleProperties, vehicleData);
    }
}
Run Code Online (Sandbox Code Playgroud)

更好的是,我会将 VehicleUtil 转换为托管 bean

@Component
public class VehicleUtil {
    @Autowired
    private VehicleProperties vehicleProperties;
}
Run Code Online (Sandbox Code Playgroud)

车辆数据

我假设 VehicleData 是一些业务对象,从客户端传递或您自己创建,它们是许多实例(而不仅仅是一个单例)。在这种情况下,将 VehicleData 转换为托管 bean 是没有意义的,它的外部依赖项只能通过其 setter 提供给它:

public class VehicleData {
    private double walkingDistance;
    private double liftWeight;
    private double remainingBattery;
    // setters & getters ....
}
Run Code Online (Sandbox Code Playgroud)