【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对象,而是在第一次调用的时候进行了实例化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值