java – Spring注释之间的区别

问题:

1)@Component和@Configuration之间的区别?

我已经阅读,这两个删除了接线代码放入XML的必要性,但没有得到这些之间的区别。

2)@Autowired,@Inject和@Resource有什么区别?
– 哪一个要使用什么时候?
– 每个的利弊是什么?

最佳答案
@Component和@Configuration是非常不同类型的注释。

@Component和类似的注释(@Service,@Repository等)和它的JSR-330对应的@Named允许你声明要通过自动扫描用< context:component-scan />或@ComponentScan,它们为类注册了bean定义,因此它们大致等效于使用< bean ... />声明指定的bean。标签。此Bean类型将遵守标准代理创建策略。

@Configuration注释被设计为替换XML配置文件。为了创建@Configuration注释的bean,Spring将总是使用CGLIB来子类化@Configuration注释的类,重写它的@Bean注释的方法,用bean的lookup方法来替换它,使单例bean只被创建一次。 (Spring不使用CGLIB来拦截正常的Spring bean的内部方法调用,它创建了一个单独的代理实例(像JDK代理一样)。这样做允许使用代理来避免基数不匹配 – 例如代理单例fetch当前会话bean,这是不可能与类继承。)。尽管如此,@Configuration注释类仍然能够使用注释(@Autowired,@Inject等)字段和属性从容器请求bean(甚至其他@Configuration注释的bean)。

示例从documentation的4.12.5节

@Configuration
public class AppConfig {

  @Bean
  public ClientService clientService1() {
    ClientServiceImpl clientService = new ClientServiceImpl();
    clientService.setClientDao(clientDao());
    return clientService;
  }
  @Bean
  public ClientService clientService2() {
    ClientServiceImpl clientService = new ClientServiceImpl();
    clientService.setClientDao(clientDao());
    return clientService;
  }

  @Bean
  public ClientDao clientDao() {
    return new ClientDaoImpl();
  }
}

在上面的示例中,将只创建一个ClientDao实例。

@Autowired是Spring注释,而@Inject是一个JSR-330注释。
@Inject等效于@Autowired或@Autowired(required = true),但是不能使用JSR-330 @Injectannotation获取@Autowired(required = false)行为。此注释始终使用逐个类型的自动装配。

Spring以一种相当特殊的方式实现了JSR-250 @Resource注释。 @Resource最初设计用于在Java EE中定位JNDI资源,但Spring扩展了它的适用性,使得可以连接到容器中的任何bean(JNDI资源在SimpleJndiBeanFactory的帮助下可用作bean)。
相应bean的名称可以指定为@Resource注释的name属性,如果未指定名称,则将使用注释字段或属性的名称。另一个奇怪的特性是,如果没有找到具有属性名称的bean,spring将回退到by-type布线。


想象一下,我们在容器中有一个名为beanAlpha的AlphaClass bean和一个BetaClass bean beanBeta。

@Resource 
BetaClass something;  // Wires to beanBeta - by-type

@Resource 
BetaClass beanAlpha;  // Will throw exception, because "beanAlpha" is not BetaClass -> it's a bad idea to use @Resource as a replacement of @Autowired

@Resource 
Object beanAlpha;  //Wires to beanAlpha - by-name

因此,当使用@Resource注释时,始终明确指定资源名称是一个好习惯。

文档

Spring annotations

Bean standard annotations

更新固定的JSR引用,如shevchik指出。 DI特定注释由JSR-330提供,由Google(Guice Framework)和SpringSource(Spring Framework)工程师开发。 @Resource是基于JNDI的,由JSR-250提供。

转载注明原文:java – Spring注释之间的区别 - 代码日志