第一篇
最初创建对象 需要new,service和serviceimpl耦合度高。
我们解耦的做法:首先我们使用反射获取字节码文件 然后newInstance实例化对象,这样解耦。反射需要全限定类名,不能写死,此时引入bean配置所有的对象。然后需要加载这个文件,解析获取bean,放到一个map中。
这是针对一个对象,项目中有很多个对象,我们需要一个容器,将所有的对象都放在这个容器中。使用的时候从容器获取。
Spring的做法:项目启动 加载xml文件 解析bean 放到容器中 需要的时候去容器获取
ApplicationContext ac = new ClassPathXmlApplicationContext() 根据类路径吓加载xml文件
ac.getBean();
scope 对象的作用域 singleton(线程安全对象使用) prototype(struts2的动作类)
init-method 初始化方法 (例如对象创建成功 容器加载后就调用start方法线程启动 )
destory-method 容器关闭对象销毁(只有scope=singleton 开启的一些资源需要销毁) ac.close()方法关闭
创建对象的三种方式 反射调用构造方法 静态工厂 实例化工厂
DI 依赖注入
构造方法注入 constructor-arg 基本类型 list类型 map类型
set方法注入 property 基本都用这个
编写xml文件 每个bean文件就相当于new对象 new对象时默认无参构造 如果依赖注入使用的是有参构造 xml报错 需要在xml中配置初始化参数
第二篇:
Spring 默认不支持注解 需要导入相应坐标 开启注解们的支持 comcontent-scan
开启包扫描 <context:component-scan base-packing=""></context:component-scan> 根据包名扫描此包及包下所有注解
交给spring容器管理的注解
@component 工具类 @configuration声明配置类
@controller @service @Repository
依赖注入 @Autowired
图灵视频:
提问::Sping 如何解决循环依赖问题
之前配置一个bean 需要在xml 中定义 使用classpathxmlApplacationContext
后来使用注解 configuration 表明是一个配置类 类里面使用注解bean 使用AnnotationConfigApplicationContext加载
包扫描使用:componentScan
bean的作用域对象:scope:默认singleton 恶汉试加载 容器启动加载 配合Lazy注解 指定为懒加载
prototype:懒汉式 第一次请求时再加载
request
session
Conditional注解:进行条件判断 如果容器中有莫个组件 就执行
提问::向IOC容器添加组件的方式
1.@bean
2.Companscan +controller service + compent repository
3:@import 场景 导入第三方组件
4.factorybean
bean的初始化 销毁方法
bean上配置init-method 容器启动就会调用初始化方法
@value + PropertySource 给属性赋值 导入xml 配置文件
提问::依赖注入默认按照什么形式注入
2.9自动装配 @Autowired 默认
Spring容器时key value 形式 key 为自定义的名称 value 为实现类全路径
自动注入首先 会查找 实现了我们需要 注入接口的实现类 如果只有一个直接拿来 如果有多个 会按照名称匹配 匹配不到报错
bytype是默认的注入方式,Spring会到容器中寻找实现了interface的Bean
1.找不到任何一个bean => 报错
2.找到一个 => 直接注入
3.找到多个 => 并不一定会报错,按照字段名字推断选择哪个bean
3.1@profile 指定运行环境
第二篇
Spring 容器流程
spring bean的实例化过程
bean和bean定义 bean的定义只有bean的信息
Sring 如何解决循环依赖
首先什么是循环依赖
Person{
Car car
}
Car{
Person person
}
这两个对象相互依赖 创建Person 对象时需要 依赖Car chu
多例对象无法解决循环依赖 因为多例对象没有进行缓存
第三节:
生命周期:
getBean的时候发生了什么
单利缓冲池:
多利没有进行缓存 所以解决不了循环依赖
spring 会分别实例化 构造方法 工厂方法
没有初始化的对象