Spring注释之间的区别

Ana*_*and 40 java spring spring-annotations

问题:

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

我已经读过,两者都删除了将代码放入XML中的必要性,但没有区分它们.

2)之间有什么区别@Autowired,@Inject@Resource
- 什么时候使用?
- 每个的优点/缺点是什么?

Bor*_*hov 55

@Component并且@Configuration确实是非常不同类型的注释.

@Component和类似的注释(@Service,@Repository等)和它的JSR-330对应物@Named允许你声明通过自动扫描获取 的bean <context:component-scan/>或者@ComponentScan它们为类注册bean定义,因此它们大致相当于声明指定的bean <bean ... />XML中的标记.此bean类型将遵循标准代理创建策略.

@Configuration注释被设计为替换XML配置文件.要创建带@Configuration注释的bean,Spring将始终使用CGLIB子类化带@Configuration注释的类,覆盖其带@Bean注释的方法以使用bean查找方法替换它,以使单个bean只创建一次.(Spring不CGLIB用于拦截普通 Spring bean的内部方法调用,而是创建一个单独的代理实例(与JDK代理一样).这样做允许使用代理来避免基数不匹配 - 例如代理单例可以获取当前会话bean,仅对类继承不可行.).尽管如此,注释类仍然能够使用注释(,等)字段和属性要求豆类(甚至其他从容器中注解的bean太).@Configuration@Autowired@Inject@Configuration

示例来自文档的 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,只会ClientDao创建一个实例.

@Autowired是Spring注释,@Inject而是JSR-330注释. @Inject相当于@Autowired@Autowired(required=true),但你无法获得@Autowired(required=false)JSR-330 @Inject注释的行为.此注释始终使用按类型自动装配.

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

示例 假设我们在容器中有一个AlphaClass名为beanAlphaBetaClassbean 和一个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
Run Code Online (Sandbox Code Playgroud)

因此,在使用@Resource注释时始终明确指定资源名称是一种很好的做法.

文档

春天注释

Bean标准注释

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


xyz*_*xyz 22

@Component相当于<bean>,
@Configuration相当于<beans>.


Kau*_*ele 5

在上面的大多数答案中,用户建议说@Component和@Configuration用于不同的目的.但我不认为它发生在现实中.

但我有一个简单的Spring MVC应用程序.

@Configuration
    public class SpringConfiguration {

@Bean
public  InternalResourceViewResolver initViewResolver(){
    InternalResourceViewResolver x = new InternalResourceViewResolver();
    x.setPrefix("/WEB-INF/jsp/");
    x.setSuffix(".jsp");
    return x;
}

}
Run Code Online (Sandbox Code Playgroud)

即使注释为@Component而不是@Configuration,这个主类也能正常工作.

类似地,在注释为@Component的类中,如果您有使用@Bean注释的方法,那么在上下文被加载时会创建这些bean.

所以我认为,只是为了代码可读性,我们应该将主配置类标记为@Configuration,并将其他类标记为@Component.实际执行明显没有区别.

  • 配置和组件之间至少有一个区别.配置允许您的Bean具有bean间依赖性,而Component则不允许.http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-java-basic-concepts (2认同)