Spring注释之间的区别

问题:

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

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

2)@ @Autowired ,@ @Inject@Resource什么区别?
– 什么时候使用?
– 每个人有什么优点/缺点?

@Component@Configuration实际上是非常不同types的注释。

@Component和类似的注解( @Service @Repository@Service @Repository等)及其JSR-330对应的@Named允许你声明要通过autoscanning拾取的bean,它们使用<context:component-scan/>@ComponentScan注册类的bean定义,所以它们大致相当于用XML中的<bean ... />标签声明指定的bean。 这个beantypes将遵循标准的代理创build策略。

@Configuration注解被devise为替代XMLconfiguration文件。 为了创build@Configuration注释的bean,Spring将总是使用CGLIB来对@Configuration注释类进行子类化,重写它的@Bean注释方法,以便用bean查找方法replace它,以使单例bean只被创build一次。 (Spring不使用CGLIB来拦截正常 Spring bean的内部方法调用,而是创build一个代理的单独实例(与JDK代理的方式相同)。这样做可以使用代理来避免基数不匹配 – 例如代理单例可以获取当前会话bean,这只能通过类inheritance来实现)。 尽pipe如此, @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实例将被创build。

@Autowired是Spring注释,而@Inject是JSR-330注释。 @Inject相当于@Autowired@Autowired(required=true) ,但是您无法通过JSR-330 @Inject注释获得@Autowired(required=false)行为。 此注释始终使用按types自动assembly。

Spring以相当特殊的方式实现JSR-250 @Resource注解。 @Resource最初是为在Java EE中查找JNDI资源而devise的,但是Spring扩展了它的适用性,使得连接到容器中的任何bean成为可能(在SimpleJndiBeanFactory的帮助下,JNDI资源作为bean可用)。 相应bean的名称可以被指定为@Resource注释的name属性,如果没有指定名称,则使用注释字段或属性的名称。 另一个奇怪的特点是,如果没有发现属性名称的bean被发现春季将回落到旁路布线。

示例假设我们在容器中有一个名为beanAlphaBetaClass 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注释

Bean标准注释

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

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

在上面的大多数答案中,用户build议说@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注释的方法,那么在上下文被使用时创build这些bean。

所以我认为,这只是代码的可读性,我们应该把主configuration类标记为@Configuration和其他类@Component。 实际执行明智似乎没有区别。

在@ @Autowired ,@ @Inject@Resource之间的区别,你可以看看这里 。 在这里你可以详细的描述和比较。

第一个区别是什么: @Configuration被用来替代基于XML的configuration,即。 它将类标记为用于基于Java的configuration的类,请参阅此处 。 反过来, @Component实际上被用来将类标记为Spring实例化的类,而@Configuration则通过@Component标注进行元标注。

@Component@Configuration服务于不同的目的,所以比较它们是没有意义的。

1)如果你想要XMLconfiguration,那么忽略@Configuration,因为这只对基于Java的configuration有用。 XMLconfiguration对于不熟悉Spring的人来说可能是最好的,因为有更多的例子可用。

组件扫描过程中会收集@Component注释类。 使用它们来标记要作为Spring bean公开的类。 同样,你可以在XMLconfiguration中声明所有的bean,并完全忽略@Component。

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