【问题标题】:How do I manually autowire a bean with Spring?如何使用 Spring 手动自动装配 bean?
【发布时间】:2012-08-11 12:42:48
【问题描述】:

我有一个 bean B,我必须自己创建它(使用 new B()),它有 @Autowire@PostConstruct 注释。

如何让 Spring 从我的 bean A 处理这些注释?

相关问题:

【问题讨论】:

    标签: java spring autowired


    【解决方案1】:

    Aaron,我相信您的代码是正确的,但我使用了以下代码:

    B bean = new B();
    AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
    factory.autowireBean( bean );
    factory.initializeBean( bean, "bean" );
    

    第一个方法将处理@Autowire 字段和方法(但不是经典属性)。第二种方法将调用后处理(@PostConstruct 和任何定义的BeanPostProcessors)。

    如果实现ApplicationContextAware接口,则可以在bean中获取应用程序上下文。

    【讨论】:

    • 可能我的代码错了。 processInjection() 只会填充 @Autowired 字段,而您的代码也应该处理 @PostConstruct(至少根据 JavaDoc)。 :-/
    • 如果类已经被@Transactional注解,它是否也创建了一个动态代理?
    • @jeromerg 否。由于 bean 是使用 new 创建的,因此 Spring 无法用代理替换实例。此处的解决方案是将所有 @Transactional 方法移动到您注入到 B 的辅助 bean 中。
    • 此方法自 2021 年 3 月 11 日起仍然有效。即使在 9 年的 OP 之后也拯救了我的一天。
    • 我认为缺少的是initializeBean()返回代理版本,所以最后一行应该是:bean = factory.initializeBean( bean, "bean" );
    【解决方案2】:

    另一个选择是让spring容器自动创建一个新bean(而不是自己用new关键字创建一个新实例)。 在需要以编程方式实例化一个新的类中,注入一个实例 AutowireCapableBeanFactory

    @Autowired
    private AutowireCapableBeanFactory beanFactory;
    

    然后:

    B yourBean = beanFactory.createBean(B.class);
    

    容器会像往常一样注入带有@Autowired注解的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 2014-06-30
      相关资源
      最近更新 更多