【问题标题】:Spring lazy loading after bean is really called真正调用bean后的spring延迟加载
【发布时间】:2014-05-04 17:00:12
【问题描述】:

我希望只有在实际使用后(而不是仅在自动装配时)才初始化(单例)bean。假设我有一个Client,只有在我想调用它的任何方法时才想初始化它

@Component
@Lazy(true)
public class Client {

    @PostConstruct
    void init() {}
    void action(){}
}

我有一个 Service 类,有时会使用它(有时可能不会)。

@Service
public class Service {

    @Autowired
    Client client;

    void action1WithClient(){}
    void action2WithClient(){}
    void actionWithoutClient(){}
}

就像现在一样,由于@Autowired 和Service 被热切加载的事实,客户端在应用程序启动时就被初始化,而没有实际使用。

目前我想到的唯一解决方案是在有人尝试使用(即没有@Autowired)或(可能更好)时从spring应用程序上下文中明确要求Client bean进行双重检查锁定在Client 中进行“手动”延迟加载。

问题:有没有一种“弹簧”方式来推迟客户端的初始化,直到它的任何方法被实际调用(例如,像延迟加载这样的东西适用于休眠集合)?

我正在使用 Spring 4。

【问题讨论】:

标签: java spring lazy-loading


【解决方案1】:

啊,好吧,我应该更正确地阅读 javadoc... 解决方案似乎添加注释“每个”自动装配依赖:

@Autowired
@Lazy
Client client;

无论如何 - 如果有人知道是否可以省略此类声明,因为它可能容易出错 - 人们很容易忘记在每个注入点使用 @Lazy。

【讨论】:

    【解决方案2】:

    编辑:
    最简单的方法是@ComponentScan(lazyInit = true, basePackages=...)。

    上一个答案:
    http://docs.spring.io/spring/docs/3.0.x/javadoc-api/org/springframework/aop/target/LazyInitTargetSource.html 使用 LazyInitTargetSource 包裹的 bean 在第一次实际使用之前不会被创建。 如何用这个包装器很好地包装你的大部分豆子?一种可能的方法是创建自己的 BeanFactoryPostProcessor...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多