繁体   English   中英

Spring注释之间的区别

[英]Difference between Spring annotations

问题:

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

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

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

@Component@Configuration确实是非常不同的注释类型。

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

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

示例来自文档的 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 @Inject注释获得@Autowired(required=false)行为。 此注释始终使用按类型自动装配。

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

例如假设我们有一个AlphaClass名为beanAlpha豆和BetaClassbeanBeta在容器中。

@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注释时始终明确指定资源名称是一种很好的做法。

文档

春天注释

Bean标准注释

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

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

在上面的大多数答案中,用户建议说@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;
}

}

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

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

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

关于@ @Autowired ,@ @Inject@Resource之间的区别,你可以看看这里 在这里你可以进行彻底的描述和比较

第一个区别是什么: @Configuration用于替换基于XML的配置,即。 它将类标记为用于基于Java的配置的类,请参见此处 反过来, @Component实际上用于将类标记为要由Spring实例化的类,而@Configuration@Component注释进行元注释。

@Component@Configuration用于不同的目的,因此比较它们没有意义。

1)如果您需要XML配置,请忽略@Configuration,因为这仅对基于Java的配置有用。 对于不熟悉Spring的人来说,XML配置可能是最好的,因为有更多可用的示例。

在组件扫描期间拾取@Component注释类。 使用它们来标记要作为Spring bean公开的类。 同样,您可以在XML配置中声明所有bean,并完全忽略@Component。

2)如果您乐意将应用程序绑定到Spring,那么请使用@Autowire而不是javax等效的@Inject。 我建议接受对Spring的依赖是最好的开始方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM