Java Spring注释之间的差异

Java Spring注释之间的差异,java,spring,spring-annotations,Java,Spring,Spring Annotations,问题: 1) @组件和@配置之间的差异 我已经读到,这两种方法都消除了将代码连接到XML中的必要性,但没有得到它们之间的区别 2) @Autowired、@Inject和@Resource之间有什么区别? -何时使用哪一个? -每种方法的优缺点是什么?关于@Autowired、@Inject和@Resource之间的区别,您可以查看。在这里你可以进行详细的描述和比较 与第一个区别有关的是:@Configuration用于替代基于XML的配置,即它将类标记为用于基于Java的配置的类,请参阅。反过

问题:


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

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

2)
@Autowired
@Inject
@Resource
之间有什么区别?
-何时使用哪一个?

-每种方法的优缺点是什么?

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

与第一个区别有关的是:
@Configuration
用于替代基于
XML
的配置,即它将类标记为用于基于
Java
的配置的类,请参阅。反过来,
@Component
实际上用于将类标记为要由
Spring
实例化的类,
@Configuration
@Component
注释进行元注释


@Component
@Configuration
有不同的用途,因此比较它们是没有意义的。
@Component
@Configuration
确实是非常不同的注释类型


@Component
和类似的注释(
@Service
@Repository
等)及其对应的
@Named
允许您声明要通过自动扫描获取的bean,它们注册类的bean定义,因此,它们大致相当于用XML中的
标记声明指定的bean。此bean类型将遵守标准代理创建策略

@Configuration
注释被设计为XML配置文件的替代品。为了创建
@Configuration
带注释的Bean,Spring将始终使用
CGLIB
@Configuration
带注释的类进行子类化,覆盖其
@Bean
带注释的方法,以Bean查找方法替换它,使单例Bean只创建一次。(Spring不使用
CGLIB
来拦截普通Springbean的内部方法调用,而是创建一个单独的代理实例(与JDK代理的方式相同)。这样做允许使用代理来避免基数不匹配-例如,代理单例可以获取当前会话bean,这仅在类继承中是不可能的。)。尽管如此,
@Configuration
注释类仍然能够使用注释(
@Autowired
@Inject
等)字段和属性从容器请求bean(甚至其他
@Configuration
注释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
示例摘自本手册第4.12.5节

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

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

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

示例 假设容器中有一个名为beanAlpha的
AlphaClass
bean和一个
BetaClass
bean 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
注释时,始终显式指定资源名称是一种很好的做法

文档


更新修复了舍甫契克指出的JSR引用。特定于DI的注释由JSR-330提供,JSR-330由Google(Guice框架)和SpringSource(Spring框架)工程师开发
@Resource
基于JNDI,由提供。

@Component
相当于

@配置
相当于

1)如果需要XML配置,则忽略@configuration,因为这只对基于Java的配置有用。XML配置可能最适合不熟悉Spring的人,因为有更多的示例可用

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


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

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