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被发现春季将回落到旁路布线。
示例假设我们在容器中有一个名为beanAlpha的BetaClass
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的依赖是最好的开始。
- 将string转换为datetime.time对象
- 在使用Java的Selenium WebDrivertesting中waitForVisible / waitForElementPresent的等效性?