spring IOC:即控制反转
上层建筑依赖下层建筑,如果要修改下层建筑,那么依赖其所有的上层建筑都需要修改,这种模式是不可维护的
依赖注入:含义:把底层类作为参数传递给上层类,实现上层对下层的"控制"
依赖注入的方式
1.Setter
2.Interface
3.Constructor
4.Annotation
IOC容器的优势
1.避免在各处使用new来创建类,并且可以做到统一维护
2.创建实例的时候不需要了解其中的细节
Spring IOC的应用
Spring IOC支持的功能
依赖注入
依赖检查
自动装配
支持集合
指定初始化方法和销毁方法
支持回调方法
Spring IOC核心接口
1.BeanFactory
2.AapplicationContext
BeanFactory : Spring框架最核心的接口
提供IOC的配置机制
包含Bean的各种定义,便于实例化Bean
建立Bean之间的依赖关系
Bean生命周期的控制
BeanFactory与ApplicationContext比较
BeanFactory是Spring框架的基础设施,面向Spring
ApplicationContext面向使用Spring框架的开发者 (比BeanFactory功能更多)
ApplicationContext的功能(继承多个接口)
BeanFactory :能够管理、装配Bean
ResourcePatternResolver :能够加载资源文件
MessageSource:能够实现国际化等功能
ApplicationEventPublisher :能够注册监听器,实现监听机制制
实战演练
1.通过@Bean注册Bean,通过ApplicationContext 获取该Bean实例
@Configuration
public class Config {
@Bean(name = "person")
public Person initPerson(){
Person user = new Person();
user.setAge("11");
user.setName("fr");
return user;
}
}
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext cx = SpringApplication.run(DemoApplication.class, args);
Person user = cx.getBean(Person.class);
System.out.printf("Name is:"+ user.getName());
}
}
2.通过SpringBoot注解@Component来装载Bean
@Component("person")
public class Person {
@Value("fr")
private String name;
@Value("11")
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
两种方式输出结果都一样,都能获取到IOC容器中的Bean实例,第二种更简单
getBean方法的代码逻辑
转换beanName
从缓存中加载实例
实例化Bean
检测parentBeanFactory
初始化依赖的Bean
创建Bean
spring Bean的相关面试题
1.spring Bean的作用域:
singleton : Spring的默认作用域,容器里拥有唯一的Bean实例
prototype :针对每个getBean请求,容器都会创建一个Bean实例
request :会为每个Http请求创建一个Bean实例
session :会为每个session创建一个Bean实例
globalSession :会为每个全局Http Session创建一个Bean实例,该作用域仅对Portleta有效
2.spring Bean的生命周期
(1)创建过程
(2)销毁过程
若实现了DisposableBean接口,则会调用destroy方法
若配置了destry-method属性,则会调用其配置的销毁方法