我知道spring AnnotationConfigApplicationContext
不仅可以接受@Configuration
类作为输入,还可以接受用JSR-330元数据注释的普通@Component
类和类。
我在没有@Configuration注释的情况下创建了AppConfig.java。
public class AppConfig {
@Bean(name="sampleService")
public SampleService getSampleService(){
return new SampleService();
}
}
将此类作为我的java配置类传递给AnnotationConfigApplicationContext
,它接受并注册了我的服务bean。
我在上面的AppConfig上做了一些修改。
@Component
public class AppConfig {
@Bean(name="sampleService")
public SampleService getSampleService(){
return new SampleService();
}
}
将AppConfig传递给AnnotationConfigApplicationContext,它接受并注册了我的服务bean。
问题:
AnnotationConfigApplicationContext
类接受带有@Configuration
的java配置类,没有@Configuration
和@Component注释,@Component
和{{之间有什么区别? 1}}
为什么即使没有@Configuration
注释也能接受?
何时使用@Configuration
,何时使用@Component作为java配置类?
答案 0 :(得分:2)
表示带注释的类是“组件”。
也就是说,在启用组件扫描的上下文中,Spring为@Component
注释类型生成bean定义。这些bean定义最终变成了bean。
@Configuration
,本身用
表示一个类声明了一个或多个
@Bean
方法,可能是 由Spring容器处理以生成bean定义和 在运行时为这些bean提供服务请求,[...]
因此,Spring为其生成bean的任何@Configuration
类型都充当bean的工厂。
@Bean
方法也可以在不是的类中声明 用@Configuration
注释。例如,bean方法可能是 在@Component
类或甚至普通的老类中声明。在这样的 例如,@Bean
方法将以所谓的“精简”模式处理。lite模式下的Bean方法将被视为普通工厂方法 容器(类似于XML中的工厂方法声明),with 正确应用范围和生命周期回调。包含类 在这种情况下保持不变,并且没有不寻常的限制 对于包含类或工厂方法。
与
@Configuration
中bean方法的语义形成对比 在lite模式下不支持类,'bean间引用'。 相反,当一个@Bean
- 方法在lite中调用另一个@Bean
- 方法时 模式,调用是标准的Java方法调用;春天呢 不通过CGLIB代理拦截调用。这类似于 inter -@Transactional
方法调用代理模式,Spring没有 拦截调用 - Spring仅在AspectJ模式下执行此操作。
所以@Bean
方法在@Configuration
注释类中具有完整功能,在@Component
注释类中具有有限的功能。
为什么即使没有@Configuration注释也能接受?
这就是课程的设计方式。 ApplicationContext
是BeanFactory
。 AnnotationConfigApplicationContext
只是提供了一种注册bean定义的额外方法。
何时使用@Configuration,何时使用@Component作为java配置类?
这些完全独立的目标。关注javadoc。当您需要设置ApplicationContext
时,可以使用带有AnnotationConfigApplicationContext
注释类的@Configuration
。如果您只需要一个bean,请使用@Component
注释其类型。
答案 1 :(得分:0)
@Component注释将 Java类标记为bean ,但是@Configuration注释将 Java类标记为包含bean(具有@Bean注释的方法)。
@Bean批注必须与@Configuration完全一起使用才能创建Spring 豆。
在下一堂课
@Component
public class AppConfig {
@Bean(name="sampleService")
public SampleService getSampleService(){
return new SampleService();
}
}
@Bean注释没有任何作用,并且getSampleService()方法将是普通的旧Java方法,并且不会是 singleton ,因为正如我提到的那样, @Bean注释必须与@一起使用配置,因此必须按以下步骤进行修复:
@Configuration
public class AppConfig {
@Bean(name="sampleService")
public SampleService getSampleService(){
return new SampleService();
}
}
因此,将@Configuration注释替换为任何其他注释,或将其删除,只需使@Bean注释无效,并且getSampleService()方法将不再成为 singleton 。
>