有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我应该用@Component注释pojo类吗?

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

下面是我的OrderStatusMnemonic配置类,它读取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类,因此出现错误:

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


共 (3) 个答案

  1. # 1 楼答案

    任何被用作light weight bean并被处理/称为POJOplain-vanilla Java Class都不应与任何Spring组件绑定

    java类可以用spring注释(即@Component@Service@Bean@Configuration)中的任何一个进行修饰,前提是该类已被adding extra flavour增强,并且仅当该类用于支持除getter setter属性之外的具有增强功能的其他类

    @Autowired只能在类被任何spring组件标记时使用,因为@Autowired是spring注释,它将只扫描正在使用spring管理的那些bean

  2. # 2 楼答案

    您现在的OrderStatus不需要注释@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;
    }
    
  3. # 3 楼答案

    @Component或@Autowired应仅用于Spring管理的类。POJO不是由Spring管理的。因此,既不应该添加@component,也不应该自动连接它。因为您试图自动连接POJO类,所以定义OrderStatus类型的bean时会出现错误