spring 如何将@Value注入setter?

gmol1639  于 2023-04-19  发布在  Spring
关注(0)|答案(4)|浏览(219)

是否可以将@Value属性注入到@Service的setter中?

@Service
public class DateService {
    private DateTimeFormatter dtf;

    public void setDtf(@Value("${spring.jackson.date-format}") String format) {
        dtf = DateTimeFormatter.ofPattern(format);
    }
}

问题:setter永远不会被调用。但是我如何注入String属性并直接从它示例化DateTimeFormatter呢?
我也试过使用SpEL,但以下格式不正确。

@Value("#{T(java.time.format.DateTimeFormatter.ofPattern(${spring.jackson.date-format}))}")
private DateTimeFormatter dtf;
1qczuiv0

1qczuiv01#

假设DateService只有一个构造函数,你可以使用构造函数注入:

@Service
public class DateService {
    private DateTimeFormatter dtf;

    @Autowired
    public DateService(@Value("${spring.jackson.date-format}") final String format) {
        this.dtf = DateTimeFormatter.ofPattern(format);
    }
}
k4emjkb1

k4emjkb12#

我不知道为什么@sxc-dev的答案被否决了,因为如果你因为某些原因不能使用构造函数,它会更好,而且它正在工作。

@Service
 public class DateService {
        private DateTimeFormatter dtf;
    
        @Autowired
        public void setDtf(@Value("${spring.jackson.date-format}") String format) {
            dtf = DateTimeFormatter.ofPattern(format);
        }
    }

这个解决方案也有效

@Service
public class DateService {
        private DateTimeFormatter dtf;
    
        @Value("${spring.jackson.date-format}")
        public void setDtf(String format) {
            dtf = DateTimeFormatter.ofPattern(format);
        }
}

如果你有lombok和其他服务要注入,这是一个非常有用的方法

@Service
@RequiredArgConstructor
public class DateService {
        private final SomeService someService;
        private DateTimeFormatter dtf;
    
        @Value("${spring.jackson.date-format}")
        public void setDtf(String format) {
            dtf = DateTimeFormatter.ofPattern(format);
        }
}
oprakyz7

oprakyz73#

不将@Value注解添加在setter方法上,而只是在成员声明上,怎么样?

@Service
public class DateService {
    @Value("${spring.jackson.date-format}")
    private DateTimeFormatter dtf;

    public void setDtf(String format) {
        dtf = DateTimeFormatter.ofPattern(format);
    }
}

除非显式地使用setter方法,否则您可能根本不需要它

7lrncoxx

7lrncoxx4#

将@Autowired添加到setter应该可以工作。

@Service
    public class DateService {
        private DateTimeFormatter dtf;
    
        @Autowired
        public void setDtf(@Value("${spring.jackson.date-format}") String format) {
            dtf = DateTimeFormatter.ofPattern(format);
        }
    }

相关问题