Spring注解:@Bean与@Component

56 阅读2分钟
  • 相同点:结果相同,都是为Spring容器注册Bean,最后Bean都会被添加到Spring上下文中。

  • 不同点

    • @Component(作用在类):(同@Controller/@Service/@Respository):表明一个类为组件类,告知spring将这个类加入容器中;

    在Spring2.5提出,主要为了通过Classpath Scanning摆脱xml文件定义bean。 只有我们的SpringBoot启动了组件扫描且包含了被注解的类时才有效。通过组件扫描,Spring将扫描整个类路径,并将所有@Component注解类添加到SpringContext,这里有个不足就是会把整个类当成Bean注册到Spring容器上,如果类中并不是所有方法都需要注册为Bean,需确保不需要的方法也能注册为Bean或者扫描中加Filter过滤不需要的Bean否则Spring无法启动。

    • @Bean(作用在方法)主要在@Configuration注解的配置类里面,告知Spring将这个方法返回的对象注册为Spring上下文中的Bean。通常方法体产生了Bean实例的逻辑。

Spring3.0提出,用在配置类中,以便完全摆脱xml文件。 相较之下@Bean更灵活,按需注册。另外引用第三方类库的某个方法时,只能用@Bean把这个方法注册到Spring,因为@Componment需要配置组件扫描这个第三方类路径而且还要在别人源码上加这个注解,不现实。@Bean修饰的方法会返回一个Spring认可的Bean,方法内可对第三方库进行设置。

@Configuration定义配置类,可替换xml配置文件,内部包含@Bean注解的方法,这些方法会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建Bean定义初始化Spring容器(要求类不可为final、匿名);