【spring系列】之1:Bean作用域及IOC懒加载

本系列所用的spring版本为5.0.8,以后其他不单独说明的版本,均采用此版本。

给容器注册bean的几种方式:

1.包扫描:ComponentScan+bean注解(@Controller,@Service,@Repository,@Component,Bean):

2.条件注入:@Conditional按条件选择注入

3.@Import快速给容器中导入一个组件

4.FactoryBean注册

spring作用域scope

spring默认提供了两种作用域:singleton,prototype

singleton:单实例(默认值),ioc容器启动会调用方法创建对象放到ioc容器中。 以后每次获取就是直接从容器(map.get())中拿

prototype:多实例,ioc容器启动并不会去调用方法创建对象放在容器中。 每次获取的时候才会调用方法创建对象

springweb提供了三种作用域:request,session,application

request:同一次请求创建共享一个实例

session:同一次会话创建共享一个实例

application:整个应用,共享一个实例

懒加载

懒加载只针对singleton单实例,容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化。

没有使用懒加载时,容器启动时创建实例

@Configuration
public class DIConfig {

	@Bean
	public Person person() {
		System.err.println("person init..");
		return new Person("lichangwu", 32);
	}

}
	@Test
	public void testPerson() {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DIConfig.class);
		printBeans(context);
		System.out.println("--------------------");
		Person p = context.getBean(Person.class);
		Person p2 = context.getBean(Person.class);
		System.out.println(p == p2);
		System.out.println(p);
	}

	private void printBeans(ApplicationContext context) {

		String[] defBeans = context.getBeanDefinitionNames();
		for (String name : defBeans) {
			System.out.println(name);
		}

	}

在容器初始化时执行了Person的初始化。

使用懒加载时,在第一次调用时创建实例


@Configuration
public class DIConfig {

	@Bean
	@Lazy
	public Person person() {
		System.err.println("person init..");
		return new Person("lichangwu", 32);
	}

}
	@Test
	public void testPerson() {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DIConfig.class);
		printBeans(context);
		System.out.println("--------------------");
		Person p = context.getBean(Person.class);
		Person p2 = context.getBean(Person.class);
		System.out.println(p == p2);
		System.out.println(p);
	}

	private void printBeans(ApplicationContext context) {

		String[] defBeans = context.getBeanDefinitionNames();
		for (String name : defBeans) {
			System.out.println(name);
		}

	}

可以看出,加了懒加载注解后,容器启动时并没有实例化Person对象,而是在第一次调用的时候进行了实例化。

猜你喜欢

转载自blog.csdn.net/licwzy/article/details/82798818