我应该用@Component 注释 pojo class 吗?

Should I annotate pojo class with @Component?

我搜索了是否应该用@Component注解POJO。貌似不建议给pojo加注解。

这是我的 OrderStatusMnemonic 配置 class 读取一个 txt 文件:

@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 class 我收到错误:

Consider defining a bean of type 'com.spectrum.sci.osm.orderstatus.OrderStatus' in your configuration.

@Component 或@Autowired 应仅用于 Spring 管理的 classes。 POJO 不受 Spring 管理。所以,既不应该添加 @component 也不应该自动装配它。由于您正在尝试自动装配 POJO class,因此您在定义 OrderStatus

类型的 bean 时出错

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

的任何地方尝试 @Autowire

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

那你什么时候需要那两个注解呢?每当您的 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;
}

任何用作 light weight bean 和 treated/called 作为 POJOplain-vanilla Java Class 不应与任何 Spring 组件。

java class 可以使用 spring 注释中的任何一个进行修饰(即 @Component@Service@Bean@Configuration) 仅当 class 已被 adding extra flavour 增强且仅当 class 用于支持其他 class 具有增强功能的其他 [=] 33=] setter 属性。

@Autowired 仅当 class 标记有任何 spring 组件时才能使用,因为 @Autowired 是 spring 将扫描的注释只有那些使用 Spring.

管理的 beans