Vin*_*ini 1 java spring dependency-injection spring-mvc spring-boot
我在下面创建了MCVE。ugly.char该服务应该收到一条消息并用来自的预定义替换元音application.properties。
应用程序属性:
ugly.char=x
Run Code Online (Sandbox Code Playgroud)
UglifyService.java:
public interface UglifyService {
String uglifyMessage(String message);
}
Run Code Online (Sandbox Code Playgroud)
UglifyServiceImpl.java:
@Service
public class UglifyServiceImpl implements UglifyService {
@Value("${ugly.char}")
private char uglyCharFromAppProp;
private final char uglyChar;
@Autowired
public UglifyServiceImpl() {
this.uglyChar = uglyCharFromAppProp;
}
@Override
public String uglifyMessage(String message) {
return message.replaceAll("[aeiouAEIOU]", String.valueOf(uglyChar));
}
}
Run Code Online (Sandbox Code Playgroud)
UglyCharController.java:
@Controller
public class UglyCharController {
private final UglifyService uglifyService;
@Autowired
public UglyCharController(UglifyService uglifyService) {
this.uglifyService = uglifyService;
}
@Value("${ugly.char}")
private char uglyChar;
@RequestMapping("/")
@ResponseBody
public String index() {
return "Usage: http://localhost:8080/some-message";
}
@GetMapping("/{message:.+}")
@ResponseBody
public String uglifyMessage(@PathVariable String message) {
String uglyMessage = uglifyService.uglifyMessage(message);
return "The ugly char is: '"+ uglyChar +"'." +
"<br>The uglifyed message is: "+ uglyMessage;
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序.java:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
问题在于,该服务不是替换元音,而是只是删除它们。
当请求localhost:8080/mymessage响应时应该是mymxssxgx,但我得到了mymssg。
我的问题是:
uglyChar在单例服务中成为最终的并且来自于,使其工作的正确方法是什么application.properties?注意:String.valueOf(uglyChar)如果我替换为,该服务就会开始工作String.valueOf(uglyCharFromAppProp),但uglyChar不会像我希望的那样是最终的。
小智 5
@Value当对象被实例化时,首先执行构造函数,然后设置并执行属性的值。因此,uglyChar 的值不具有该属性的值。
你可以这样做:
private final char uglyChar;
@Autowired
public UglifyServiceImpl(@Value("${ugly.char}") final char uglyCharFromAppProp){
this.uglyChar = uglyCharFromAppProp;
}
Run Code Online (Sandbox Code Playgroud)