Java Spring 3中@Component和@Configuration之间的差异
我遇到了Spring3提供的两个注释(和) 我对这些有点困惑。Java Spring 3中@Component和@Configuration之间的差异,java,spring,spring-3,Java,Spring,Spring 3,我遇到了Spring3提供的两个注释(和) 我对这些有点困惑。 下面是我读到的关于@Component的内容 将这个“context:component”放在bean配置文件中,这意味着, 在Spring中启用自动扫描功能。基本包已显示 您的组件存储在哪里,Spring将扫描此文件夹并 找到bean(用@Component注释)并在中注册它 弹簧容器 所以我想知道@Configuration有什么用,如果@Controller将注册我的bean而不需要在spring配置xml文件中声明它们,那么
下面是我读到的关于@Component的内容 将这个“context:component”放在bean配置文件中,这意味着, 在Spring中启用自动扫描功能。基本包已显示 您的组件存储在哪里,Spring将扫描此文件夹并 找到bean(用@Component注释)并在中注册它 弹簧容器
所以我想知道@Configuration有什么用,如果@Controller将注册我的bean而不需要在spring配置xml文件中声明它们,那么@Configuration是spring 3中引入的基于Java的配置机制的核心。它提供了基于XML的配置的替代方案 因此,以下两个片段是相同的:
<beans ...>
<context:component-scan base-package="my.base.package"/>
... other configuration ...
</beans>
在这两种情况下,Spring都将在
my.base.package
及以下文件中扫描使用@Component
注释的类,或使用@Component
元注释的其他注释之一,例如来自Book Pro Spring Integration的@Service
@Configuration
类与常规的@Components
类类似,只是用@Bean
注释的方法用于工厂Bean。请注意,带有@Bean
注释方法的@Component
的工作方式相同,只是不尊重作用域,并且重新调用@Bean
方法(没有缓存),因此首选@Configuration
,即使它需要CGLIB,这里与完整示例不同:-
//@Configuration or @Component
public static class Config {
@Bean
public A a() {
return new A();
}
//**please see a() method called inside b() method**
@Bean
public B b() {
return new B(a());
}
}
1) 在这里,如果用@configuration注释的Config类比a()方法和b()方法都要调用一次
2) 在这里,如果用@component注释Config类,那么b()方法将被调用一次,而a()方法将被调用两次
问题(2):-因为我们已经注意到@component注释的问题。
第二种配置(2)完全不正确,因为spring将创建a的单例bean,但B将获得a的另一个实例,该实例不受spring上下文控制
解决方案:-我们可以在配置类中使用@autowired注释和@component注释
@Component
public static class Config {
@Autowired
A a;
@Bean
public A a() {
return new A();
}
@Bean
public B b() {
return new B(a);
}
}
虽然这很古老,但详细阐述了JavaBoy和Vijay的答案,并举例说明:
@Configuration
public class JavaConfig {
@Bean
public A getA() {
return new A();
}
}
@Component
@ComponentScan(basePackages="spring.example")
public class Main() {
@Bean
public B getB() {
return new B();
}
@Autowired
JavaConfig config;
public static void main(String[]a) {
Main m = new AnnotationConfigApplicationContext(Main.class)
.getBean(Main.class);
/* Different bean returned everytime on calling Main.getB() */
System.out.println(m.getB());
System.out.println(m.getB());
/* Same bean returned everytime on calling JavaConfig.getA() */
System.out.println(m.config.getA());
System.out.println(m.config.getA());
}
}
@Component
是一个通用原型注释,它可以指示任何候选组件,即:<代码>@Repository、@Service、@Controller,这些候选者可以自动检测
当as
@Configuration
用于创建spring框架用于创建应用程序上下文的组件时,内部@Configuration
使用@component
,即使是框架本身创建的spring组件也是合理的 “注意A与B相似,只是B的行为与X相似。注意A的行为也与X相似。”太好了。我想在(2)中B会被调用一次,A会被调用两次
@Configuration
public class JavaConfig {
@Bean
public A getA() {
return new A();
}
}
@Component
@ComponentScan(basePackages="spring.example")
public class Main() {
@Bean
public B getB() {
return new B();
}
@Autowired
JavaConfig config;
public static void main(String[]a) {
Main m = new AnnotationConfigApplicationContext(Main.class)
.getBean(Main.class);
/* Different bean returned everytime on calling Main.getB() */
System.out.println(m.getB());
System.out.println(m.getB());
/* Same bean returned everytime on calling JavaConfig.getA() */
System.out.println(m.config.getA());
System.out.println(m.config.getA());
}
}