当前位置: 首页 > 知识库问答 >
问题:

Spring注释之间的差异

乌靖
2023-03-14

问题:

1) @组件@配置之间的差异?

我已经读到,这两种方法都消除了将代码连接到XML中的必要性,但没有得到它们之间的区别。

2) @Autowired@Inject@Resource之间有什么区别?
-何时使用哪一种?
-每种方法的优缺点是什么?

共有3个答案

梁烨烨
2023-03-14

在上面的大多数答案中,用户建议说@Component和@Configuration有不同的用途。但我看不到它在现实中发生。

但是我有一个简单的SpringMVC应用程序。

@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。从实际执行来看,似乎没有什么区别。

唐宇定
2023-03-14

@Component相当于

邹杰
2023-03-14

@组件@配置确实是非常不同的注释类型。

@Component和类似的注释(@Service@Repository等)及其JSR-330对应的@Named允许您声明要通过自动扫描获取的bean

@Configuration注释被设计为XML配置文件的替代品。为了创建@Configuration带注释的Bean,Spring将始终使用CGLIB@Configuration带注释的类进行子类化,覆盖其@Bean带注释的方法,以Bean查找方法替换它,使单例Bean只创建一次。(Spring不使用CGLIB来拦截普通Springbean的内部方法调用,而是创建一个单独的代理实例(与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实例。

@自动生成的是Spring注释,而@Inject是JSR-330注释。@Inject等价于@autowier@autowier(必需=true),但您无法获得@autowmed(必需=false)使用JSR-330@Inject注释的行为。此注释始终使用by类型自动连接。

Spring以一种非常特殊的方式实现了JSR-250@Resource注释@Resource最初是为在JavaEE中定位JNDI资源而设计的,但是Spring扩展了它的适用性,使它能够连接到容器中的任何bean(JNDI资源在SimpleJndiBeanFactory的帮助下作为bean提供)。相应bean的名称可以指定为@Resource注释的name属性,如果未指定名称,则将使用注释字段或属性的名称。另一个奇怪的特性是,如果找不到具有属性名的bean,spring将退回到按类型连接。

例如,假设容器中有一个名为beanAlpha的AlphaClassbean和一个BetaClassbean bean。

@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标准注释

更新固定的JSR引用,正如shevchik所指出的。DI特定注释由JSR-330提供,JSR-330由Google(Guice框架)和SpringSource(Spring框架)工程师开发。

 类似资料:
  • 问题内容: 问题: 1)和之间的区别? 我已经读过,两者都消除了将连接代码放入XML中的必要性,但是并没有获得两者之间的区别。 2)之间有什么区别,和? -何时使用哪个? -每个优点/缺点是什么? 问题答案: 并且确实是非常不同类型的注释。 以及类似的注释(,等)及其对应的JSR-330允许您声明要通过自动扫描拾取的bean , 或者它们为类注册了bean定义,因此它们大致等效于使用以下命令声明指

  • 和之间有什么区别? 我在一些Spring反应示例中看到,使用了而不是

  • 我使用Spring boot反应式web流量作为restendpoint。 以下两者之间的区别是什么: 到 我不理解我的控制器方法在输入参数上的差异。我知道一个是pojo,另一个是mono,但从反应的角度来看,这意味着什么?

  • 问题内容: 我很好奇是否有人在使用私有字段而不是公共获取方法注释实体之间的性能差异方面有任何困难的数字。我听说人们说字段变慢了,因为它们被称为“通过反射”,但是getter方法也是,不是吗?Hibernate需要它试图读它,我可以看到有一些前场的无障碍设置为true 轻微的 开销。但是,不是在Session范围内的Class级别上执行此操作,还是在读取Configuration并构建Session

  • 问题内容: 我很好奇是否有人在使用私有字段而不是公共获取方法注释实体之间的性能差异方面有任何困难的数字。我听说人们说字段变慢了,因为它们被称为“通过反射”,但是getter方法也是,不是吗?Hibernate需要它试图读它,我可以看到有一些前场的无障碍设置为true 轻微的 开销。但是,这不是在Session范围内的类级别上完成,还是在读取Configuration并构建SessionFactor

  • 下面两个属性有什么区别,什么时候用哪个?