Следует ли аннотировать класс pojo с помощью @Component? - PullRequest
0 голосов
/ 06 августа 2020

Я искал, следует ли аннотировать POJO с помощью @Component или нет. Похоже, что рекомендуется не аннотировать pojo.

Вот мой OrderStatusMnemoni c Класс конфигурации, который читает текстовый файл:

@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);
        }
    }
        
}

OrderStatus POJO:

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

Поскольку я автоматически подключаю класс OrderStatus POJO, я получаю сообщение об ошибке:

Рассмотрите возможность определения bean-компонента типа com.spectrum.sci.osm .orderstatus.OrderStatus 'в вашей конфигурации.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Ваш OrderStatus в том виде, в каком он сейчас, не требует аннотации @Component, поэтому вы не должны его добавлять. Также вы не должны пытаться @Autowire его где-нибудь без @Component.

Конечно, вы можете добавить @Component, а затем @Autowire где угодно, но в этом нет смысла, так как вы можете больше легко создать экземпляр вашего POJO, просто набрав new OrderStatus(). И это также может быть пустой тратой ресурсов.

Тогда, когда вам понадобятся эти две аннотации? Когда ваш POJO должен стать управляемым компонентом. Другими словами, когда 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;
}
1 голос
/ 06 августа 2020

@ Component или @Autowired следует использовать только для классов, управляемых Spring. POJO не управляются Spring. Таким образом, не следует ни добавлять @component, ни автоматизировать его. Поскольку вы пытаетесь автоматически подключить класс POJO, вы получаете сообщение об ошибке при определении bean-компонента типа OrderStatus

...