2.@Scope 作用域和@Lazy懒加载
@Scope来表示注册对象的作用域。
@Scope的四种类型
//多例模式,只有在使用类时才注册对象 ConfigurableBeanFactory#SCOPE_PROTOTYPE //单例模式(默认),容器初始化时就注册对象,不过可以通过@Lazy注解来实现懒加载 ConfigurableBeanFactory#SCOPE_SINGLETON //web的requerst域(不常用) org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST //web的Session域(不常用) org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
@Configuration
public class ScopeConfig {
@Bean
@Scope("prototype")
public Person person(){
System.out.println("向容器中注册Person对象。。。。");
return new Person("gaoyuzhe ",12);
}
}
public class ScopeConfigTest {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(ScopeConfig.class);
/**
* 遍历匹配的组件名称
* @param annotationConfigApplicationContext 注解上下文
*/
private void printClassName(AnnotationConfigApplicationContext annotationConfigApplicationContext){
String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
for (int i = 0; i < beanDefinitionNames.length; i++) {
System.out.println("匹配的类"+beanDefinitionNames[i]);
}
}
@Test
public void person() {
printClassName(annotationConfigApplicationContext);
}
}
调用Person对象
@Test public void person() { printClassName(annotationConfigApplicationContext); Person person1 = annotationConfigApplicationContext.getBean(Person.class); System.out.println(person1); Person person2 = annotationConfigApplicationContext.getBean(Person.class); System.out.println(person2); System.out.println(person1 ==person2); }