函数式接口本身不直接参与依赖注入,它和依赖注入是两个不同层面的机制:函数式接口属于语言特性(Java 8+ 的函数式编程支持),而依赖注入(DI)属于框架级设计模式(如 Spring)。
函数式接口本身不直接参与依赖注入,它和依赖注入是两个不同层面的机制:函数式接口属于语言特性(Java 8+ 的函数式编程支持),而依赖注入(DI)属于框架级设计模式(如 Spring)。但二者可以在实际开发中协同使用——关键在于“把函数式接口作为可注入的 Bean 行为”,或“在注入后的对象里用函数式接口封装逻辑”。
Spring 支持将实现了函数式接口的 Lambda 或方法引用注册为 Bean,前提是该接口有明确的类型标识(如 Function、Supplier、Consumer 等内置接口),Spring 能识别其函数签名并完成类型匹配。
@Bean<br>public Function<String, Integer> stringLengthMapper() {<br> return s -> s != null ? s.length() : 0;<br>}
@Autowired Function<String, Integer> 注入并复用该行为,无需定义具体实现类;@Bean 方法返回类型为函数式接口,不能只写 var 或泛型擦除后的原始类型,否则 Spring 无法推断目标类型。当某个服务类已通过 DI 获取了依赖(如 UserService 注入了 UserRepository),它内部可用函数式接口解耦业务逻辑与执行细节,提升可测试性与扩展性。
立即学习“Java免费学习笔记(深入)”;
Function<User, String> 作为参数,动态决定用户信息的格式化方式:public String formatUser(User user, Function<User, String> formatter) {<br> return formatter.apply(user);<br>}
formatUser(u, u -> u.getName() + " (ID: " + u.getId() + ")");若需更语义化的抽象,可自定义函数式接口,并将其作为 Spring Bean 的类型契约。
@FunctionalInterface<br>public interface UserValidator {<br> boolean isValid(User user);<br>}
EmailValidator、AgeValidator),各自标注 @Component;@Autowired private UserValidator emailValidator;;@Qualifier 指定。函数式接口不是“可注入对象”的银弹,需注意边界:
@Bean 方法包装后注册;String::length)同理,需包裹在 @Bean 中才可注入;@Configuration 类中直接 new 出函数式接口实例(如 new Function<>(){...}),这会绕过 Spring 容器,失去 AOP、事务等增强能力;