我应该用@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 作为 POJO 的 plain-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
我搜索了是否应该用@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 作为 POJO 的 plain-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.