目录

Spring Annotation

Spring Annotation

@Component 与 @Bean

@Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。

@Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。

两者的目的是一样的,都是注册bean到Spring容器中。

区别:

  • @Component 作用于类,@Bean作用于方法。
  • @Component(@Controller、@Service、@Repository)通常是通过类路径扫描来自动侦测以及自动装配到 Spring 容器中,对需要进行逻辑处理的控制非常有限,因为它纯粹是声明性的。而 @Bean注解的方法返回值是对象,可以在方法中为对象设置属性。
  • 如果想将第三方的类变成组件,你又没有没有源代码, 就可以使用@Bean
  • Spring的Starter机制,就是通过@Bean注解来定义bean。可以搭配@ConditionalOnMissingBean注解 @ConditionalOnMissingClass注解

@Autowired 与 @Resource

  • @Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。
  • @Resource是JDK原生的注解,@Autowired是Spring2.5 引入的注解
  • @Resource有两个属性name和type。Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  • @Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。

BeanFactory 与 ApplicationContext

ApplicationContext 接口,它扩展了BeanFactory接口,此外还扩展了其他接口以提供更多面向应用程序框架的样式的附加功能。

  • 通过 MessageSource 接口访问国际化资源。
  • 通过 ResourceLoader 接口访问资源,例如 URL 和文件。
  • ApplicationListener 事件发布,即通过使用接口发布给实现接口的bean ApplicationEventPublisher。
  • 加载多个(分层)上下文,让每个上下文都通过接口专注于一个特定的层,例如通过接口 HierarchicalBeanFactory 加载应用程序的 Web 层
特征 BeanFactory ApplicationContext
Bean instantiation/wiring(实例化/装配)
继承的生命周期管理
自动 BeanPostProcessor 注册
自动 BeanFactoryPostProcessor 注册
方便 MessageSource 的访问(国际化)
内置 ApplicationEvent 发布机制