У меня есть Spring @Component
, который добавляется как зависимость в другой класс с аннотацией @Lazy
. Согласно https://www.baeldung.com/spring-lazy-annotation, https://howtodoinjava.com/spring5/core/spring-bean-eager-vs-lazy-init/, https://stackoverflow.com/a/50041333/6923588 сам @Component
должен быть помечен @Lazy
для работы. Но следующий код кажется работающим без добавления аннотации @Lazy.
Интерфейс отложенного компонента.
public interface Lazzy {
public void doSome();
}
Реализация отложенного компонента.
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Component;
@Component
// @Lazy // annotation is commented out
public class LazzyImpl implements Lazzy {
private static Logger logger = LogManager.getLogger(LazzyImpl.class);
@PostConstruct
private void init() {
logger.debug("in init");
}
@Override
public void doSome() {
logger.debug("am called");
}
}
Класс Runner.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/test-context.xml" })
public class LazyTest {
private static Logger logger = LogManager.getLogger(LazyTest.class);
@Autowired
@Lazy
private Lazzy lazzy;
@Test
public void test_Lazy() {
logger.debug("in test_Lazzy");
// lazy.doSome(); // intentionally commented out to check whether LazzyImpl is initialized or not
logger.debug("in test_Lazzy over");
}
}
Когда я запускаю это, я вижу следующее.
LazyTest.test_Lazy(LazyTest.java:25) - in test_Lazzy
LazyTest.test_Lazy(LazyTest.java:27) - in test_Lazzy over
Если я снимаю @Lazy
на private Lazzy lazzy;
с lazy.doSome();
, все еще закомментированным, я вижуследующий (как и ожидалось).
LazzyImpl.init(LazzyImpl.java:17) - in init
LazyTest.test_Lazy(LazyTest.java:25) - in test_Lazzy
LazyTest.test_Lazy(LazyTest.java:27) - in test_Lazzy over
Вопрос: Почему этот код работает (т.е. инициализируется лениво) без @Lazy
аннотации на LazzyImpl
вместе с @Component
?
Пример использования Spring 4.0.3.RELEASE версии.