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