我想在实际使用它之后初始化(单例)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.
答案 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 ......