【问题标题】:Spring - Are annotations like @Component BeanPostProcessorsSpring - 是像@Component BeanPostProcessors 这样的注释吗
【发布时间】:2021-01-24 13:17:34
【问题描述】:

我读到 @Autowired、@Transactional 和 @PostConstruct 等 Spring 注释是/使用 BeanPostProcessors 的一种形式。因此,根据我对 BeanPostProcessors 的了解,它们用于管理 Spring Bean 的生命周期。这意味着您可以指定应该在 bean 初始化之前或之后运行的任何代码。

现在像@Component 或@Bean 这样的注解向Spring 指定它应该创建这种类型的bean。例如,

@Component
public Class Foo {

}

将告诉 spring 创建一个“Foo”类型的 Bean,然后 Spring 将管理它的生命周期。那么这会产生@Component 和@Bean BeanPostProcessors 吗?

【问题讨论】:

    标签: java spring


    【解决方案1】:

    我读到 @Autowired@Transactional@PostConstruct 等 Spring 注释是/使用 BeanPostProcessors 的一种形式。

    两者都不是,实际上恰恰相反。查找注释并做出相应反应的是 BeanPostProcessors。

    • AutowiredAnnotationBeanPostProcessor - BeanPostProcessor 实现自动连接带注释的字段、setter 方法和任意配置方法。这种要注入的成员是通过注解检测的:默认是Spring的@Autowired@Value注解。

      还支持 JSR-330 的 @Inject 注释(如果可用)作为 Spring 自己的 @Autowired 的直接替代品。

    • CommonAnnotationBeanPostProcessor - BeanPostProcessor 实现,支持开箱即用的常见 Java 注释,特别是 javax.annotation 包中的 JSR-250 注释。许多 Java EE 5 技术(例如 JSF 1.2)以及 Java 6 的 JAX-WS 都支持这些常见的 Java 注释。

      此后处理器包括对 PostConstructPreDestroy 注释的支持 - 分别作为 init 注释和 destroy 注释 - 通过从 InitDestroyAnnotationBeanPostProcessor 继承并具有预配置的注释类型。

    请注意,@Transactional 不由 BeanPostProcessor 处理。


    现在像@Component@Bean 这样的注解向Spring 指定它应该创建这种类型的bean。 [...] 那么这是否会使 @Component@Bean BeanPostProcessors?

    没有。

    @Component 是组件扫描框架查找要注册的bean 的注解。组件扫描框架还会查找本身使用@Component 注释的注释,例如@Configuration@Controller@Service@Repositiory 注释。

    @Bean 注释随后由BeanDefinitionRegistryPostProcessor(不是BeanPostProcessor)处理。

    • ConfigurationClassPostProcessor - BeanFactoryPostProcessor 用于 @Configuration 类的引导处理。

      此后处理器按优先级排序,因为在 @Configuration 类中声明的任何 Bean 方法在任何其他 BeanFactoryPostProcessor 执行之前注册其相应的 bean 定义非常重要。

    【讨论】:

    • 感谢@Andres 提供如此详细的答案。这消除了我的疑虑。
    【解决方案2】:

    不!它们是不同的。

    1. BeanPostProcessor用于在创建bean之前和之后执行一些操作,这允许我们在创建bean之前和之后添加一些代码。

    BeanPostProcessor 类有两个方法。

    • postProcessBeforeInitialization :用于确保在初始化之前采取必要的操作。例如您想从远程源/服务加载某些属性文件/读取数据。

    • postProcessAfterInitialization :它负责在将 bean 引用提供给应用程序之前初始化之后要执行的任务。

    详情参考:spring-doc-beans-customizing-using-BeanPostProcessor 接口。


    1. @Component : 最通用的 Spring 注解。

    在类路径扫描期间发现一个用@Component 修饰的Java 类,并在上下文中注册为Spring bean。

    详情请参阅: spring-doc-component-annotation

    【讨论】:

    • 这个。基本上@Component@Bean 注释被用作目标,以便Spring 可以找到它应该在启动时实例化的所有对象。如果您想自己“尝试”一下,您可以使用自定义注释和反射自己做类似的事情。
    猜你喜欢
    • 1970-01-01
    • 2014-09-12
    • 2020-10-17
    • 2011-04-04
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2011-11-11
    • 2014-06-30
    相关资源
    最近更新 更多