首页 > 解决方案 > 我应该用@Component 注释 pojo 类吗?

问题描述

我搜索了是否应该用@Component 注释 POJO。似乎建议不要注释 pojo。

这是读取 txt 文件的OrderStatusMnemonic配置类:

@Configuration
public class OrderStatusMnemonic {
    private static final Logger log = LoggerFactory.getLogger("OrderStatusMnemonic.class");
    
    private ResourceLoader resourceLoader;
    
    @Autowired
    public OrderStatus orderStatus;

    public OrderStatusMnemonic(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }
    
    @PostConstruct
    public void init() {
        try {
            log.info("Loading order-status-mnemonic file ");
            Resource resource = resourceLoader.getResource("classpath:order-status-mnemonic.txt");
            InputStream inputStream = resource.getInputStream();
            
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            
            String str;
            List<String> orderStatusMnemonicList = new ArrayList<>();
            while ( (str = bufferedReader.readLine()) != null) {
                log.info("str = " + str);
                            
                orderStatusMnemonicList.add(str);
            }
            
            orderStatus.setValues(orderStatusMnemonicList);
            
            log.info("orderStatusMnemonicList = " + orderStatusMnemonicList.toString());
            
            
        } catch (IOException | NullPointerException e) {
            log.error("Failing to Load order status mnemonic file" + e.getMessage(), e);
        }
    }
        
}

订单状态POJO:

@Getter
@Setter
@ToString
public class OrderStatus {
    private List<String> values;
}

由于我正在自动装配 OrderStatus POJO 类,因此出现错误:

考虑在您的配置中定义“com.spectrum.sci.osm.orderstatus.OrderStatus”类型的 bean。

标签: javaspring-bootdependency-injectionannotationsautowired

解决方案


OrderStatus现在不需要注释@Component,所以你不应该添加它。此外,您不应该@Autowire在没有@Component.

您当然可以在需要的任何地方添加@Component然后@Autowire它,但它没有任何意义,因为您可以更轻松地实例化您的 POJO,只需发出new OrderStatus(). 这也可能是一种资源的浪费。

那么,什么时候需要这两个注解呢?每当您的 POJO 需要成为托管 bean 时。换句话说,当需要 Spring 做一些自动的事情时。考虑你的 POJO 会有更复杂的东西,比如(查看评论):

// Enables autowiring OrderStatus -> autowired OrderStatus is managed 
// by Spring
@Component 
public class OrderStatus {
    private List<String> values;
    // Then there is something to autowire to OrderStatus also
    // Without OrderStatus being managed by Spring this would be ignored!
    // But because managed, Spring autowires also this one
    // Of course SomeOtherManagedBean must be a @Component, for example
    @Autowired
    private SomeOtherManagedBean somb;
}

推荐阅读