【问题标题】:Spring 4 Component Inject with generic带有泛型的 Spring 4 组件注入
【发布时间】:2018-01-04 12:42:07
【问题描述】:

我遇到了以下问题。我想用泛型创建 Spring @Component

@Component
public class ResponseDtoValidator<DTO> {

public ResponseEntity<DTO> methodToInvoke(DTO dto) {
return Optional.ofNullable(dto).map(result -> new >ResponseEntity<>
(result, HttpStatus.OK))
.orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)); }
}

@Controller
public class SomeController {
@Inject
private ResponseDtoValidator<DTO1> responseDtoValidator1;

@Inject
private ResponseDtoValidator<DTO2> responseDtoValidator2;

public void someMethod() {
DTO1 dto1 = new DTO1();
DTO2 dto2 = new DTO2();
responseDtoValidator1.methodToInvoke(dto1);
responseDtoValidator2.methodToInvoke(dto2);
}
}

我可以像上面那样注入这个组件吗?其实我试过了,好像可以正常使用,请问您确认我是不是正确的?

【问题讨论】:

标签: java spring generics autowired inject


【解决方案1】:

首先,spring bean 本身不能注入。

关于您的问题,是的,它是可注射的,但注射时不要使用通用标志。正常注入就行了。当使用泛型类的方法时发送泛型类型。

例如;

@Component 
public class ResponseDtoValidator<DTO> {

    public void getAbc(List<DTO> aList) {}
}

那么;

public class Test {

    @Autowired // or @Inject
    private ResponseDtoValidator responseDtoValidator;

    public void testMethod() {
        responseDtoValidator.getAbc(List<EnterATypeInHere> aList);
    }
}

【讨论】:

  • 请阅读这篇文章:blog.jayway.com/2013/11/03/…
  • 这和我写的一样@IgorOrekhov
  • 哦,我明白你的意思了。但是为什么我在注射时不应该使用通用标志?由于泛型类型仅在方法调用时发送,它只是无用的?
  • 注入 bean 时,意味着 Spring 创建了一个组件类,在我的例子中,bean 创建为单例。如果 @Component 具有泛型,则必须在创建 bean 时定义泛型类型。如果我向这个注入的 bean 发送各种 DTO-s,他将如何处理呢?
  • 如果在创建 bean 时给出泛型类型,则不能将 bean 与另一个对象一起使用。例如 ; @Inject ResponseDtoValidator&lt;Type1Object&gt; responseDtoValidator; 您只能使用此 bean 发送到 Type1Object 参数。如果你这样写:responseDtoValidator.getAbc(List&lt;Type2Object&gt; aList); 它会得到不兼容的参数类型错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2014-05-09
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多