标签:面向切面编程 依赖 输入参数 面向切面 map 经验 解决 弊端 杂类
Spring的两大核心概念:
Spring的IOC(依赖反转注入)和Spring的AOP(面向切面编程)
其中,这两者所处的位置(pic1)
Spring的两大优势:
方便解耦
方便AOP
声明式编程
方便测试
方便集成一些优秀的框架
方便使用JAVAEE的API
Spring的体系架构:
耦合,可以理解为依赖关系
包括:
1. 类之间的依赖关系
2. 方法之间的依赖关系
解耦,做到:
编译时不依赖,运行时依赖
方法:
1. 采用反射的方式创建对象,避免使用new关键字
2. 读取配置文件来获得全限定类名
首先我们要创建bean对象:
bean对象是什么,怎么做
1. properties 是什么
Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存属性集。不过Properties有特殊的地方,就是它的键和值都是字符串类型。
2. 怎么用properties配置(https://www.cnblogs.com/xudong-bupt/p/3758136.html)
2.1 初步配置
1)根据x.properties文件load一个Property对象
2)这个Property对象中以键值对的形式存储着你的你想要的类的具体类名
3)用classforName加载
2.2 为了单例模式,把加载过的类储存起来
1)加载一个bean的map类型
2)在静态代码块的时候就把这个map得到
考虑为什么单例是可以的:外部没有需要修改的属性,否则单例在多线程可能会出错
控制反转:一个类把自己创建类的权利交给了另一个框架(工厂)
也就是这个类只能根据名字创建对象,至于创建出来的对象是不是他想要的那一个,其实是无法控制的,这是由配置文件来决定的
具体实现:
上图也是ApplicationContext常用的三个实现类:
ClassPathXmlApplicationContext :加载类路径下的配置文件
FileSystem.... :加载磁盘路径下的配置文件
AnnotationConfig... : 基于注解的配置
对象是什么时候创建的?
1. 对象在 new 容器的时候创建 —— 更适合单例模式
2. 对象在我们需要用到,也就是根据id去获取的时候创建 —— 更适合多例模式
对于具体实现来说,ApplicationContext接口是1,而更顶层的BeanFactory接口是2
但对于一般使用,用1,因为底层接口往往更加完善,并且我们也可以通过配置实现多例
具体来说:
Spring对bean的管理细节
1. 创建bean的三种方式
a.使用默认构造函数(一旦写了自己的构造函数就没法使用)(经验证,不是完全没法使用,是一旦自己写的那个构造函数带输入参数就用不了)(但是可以做到其他的参数配置)
b.使用某个类中的方法创建对象,并存入bean容器
c.使用某个类中的静态方法(则不需要先构造该类本身的实例)
2. bean的作用范围
3. 生命周期
singleton : 生命周期跟随容器的生命周期,容器生则生,容器死则死
prototype:生命周期跟随引用的机制,当我们需要并把它从factory中取出来后,它就跟随那个引用了,并且等待jvm回收
依赖注入:
也就是具体来说怎么创建对象
1. 构造函数的注入:
前面的默认构造函数注入适用点太少,我们可以添加标签扩展能力
有哪些以及怎么用如下:
弊端:初始化的时候不需要的值也被注入了
采用set方法注入:
弊端:set方法不能保证某个属性一定有值
复杂类型的注入:
标签:面向切面编程 依赖 输入参数 面向切面 map 经验 解决 弊端 杂类
原文地址:https://www.cnblogs.com/Plorde/p/12494944.html