真正调用bean之后的Spring延迟加载

时间:2014-05-04 17:00:13

标签: java spring lazy-loading

我想在实际使用它之后初始化(单例)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)或(甚至可能)使用弹簧应用程序上下文时,明确要求Client bean进行双重检查锁定。更好)在Client内进行“手动”延迟加载。

问题:是否有一种“弹簧”方式推迟客户端的初始化,直到实际调用任何方法(例如延迟加载对hibernate集合有效)?

我正在使用Spring 4.

2 个答案:

答案 0 :(得分:2)

啊,好吧,我应该更正确地阅读javadoc ...解决方案似乎添加anotation“每个”autowired依赖:

@Autowired
@Lazy
Client client;

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

答案 1 :(得分:2)

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

上一个回答:
http://docs.spring.io/spring/docs/3.0.x/javadoc-api/org/springframework/aop/target/LazyInitTargetSource.html {{3}} 在第一次实际使用之前,将不会创建用LazyInitTargetSource包装的bean。 如何用这个包装器很好地包装你的大多数bean?一种可能的方法是创建自己的BeanFactoryPostProcessor ......