spring快照版本是最新的版本,未发布。需要用到
下面这个不需要配置仓库,直接写在依赖中就行
引入spring相关依赖
4.0.0
com.grin
spring-002-first
1.0-SNAPSHOT
jar
17
17
UTF-8
org.springframework
spring-context
6.0.10
junit
junit
4.13.2
test
疑惑:
1.类加载路径
类路径classpath指的是编译后路径即:
本项目[或模块目录]/target/[项目或模块名]/WEB-INF/classes
原项目中java目录下的文件和recource目录下的文件页都被打包到了此类路径下。
如下图: java目录中的文件和recource目录中的文件经过编译后,都会放到WEB-INF/classes目录下:
把test写成private后,外界调用不了这个测试方法。
一个小细节:发现构造方法,不是在getBean()时创建的。
证明如下:
上去就报错了
第一步:引入依赖
org.apache.logging.log4j
log4j-core
2.19.0
org.apache.logging.log4j
log4j-slf4j2-impl
2.19.0
第二步:在类的根路径下提供log4j2.xml配置文件(文件名固定为:log4j2.xml,文件必须放到类根路径下。)
第三步:使用日志框架
Logger logger = LoggerFactory.getLogger(FirstSpringTest.class);
logger.info("我是一条日志消息");
在配置文件中,已经指定了 debug日志级别, 很有意思。当打印日志时,如果低于这个级别,则不会打印出来。
除此之外,你可以在配置文件中去指定这个级别。
1.set注入。
配合property标签,
注意 name是 本类的set方法的名字:去掉set,首字母小写
ref 是所要引用 的其他类。
总之,通过 本类的set方法对所引用的类进行注入。
‘
2.构造注入
利用, name属性可被 索引,类型推断 替代。
3.内部bean和外部
没有那么复杂,声明在外面的bean叫做 外部bean,有自己的 id 和class .
而内部bean写在
4.给简单类型注入
疑惑:为什么要给它注入。
下面是spring中认为的基本数据类型,不使用ref来引用,而是通过name属性。
但要注意 Date类型的注入,要满足它所要求的格式。
在实际开发中,不会用Date这种注入方式,应该有更好的。
经典:
注入空字符串
注入的值含有 特殊符号
第二种方案,只能用
验证xml文档
根据名字自动装配
根据类型自动装配
根据类型进行自动装配时,在有效的配置文件当中,某种类型的实例只能有一个
当加载时,会默认先加载windows中的环境变量,因此要在properties文件中的key前 加上 jdbc前缀
下面是引入步骤:
我们都知道编写数据源的时候是需要连接数据库的信息的,例如:driver url username password等信息。这些信息可以单独写到一个属性配置文件中吗,这样用户修改起来会更加的方便。当然可以。
创建实现数据源的类
引入配置文件,并可以用${}进行根据key取值
单例和多例(singleton ans protope)
自定义scope, 同一个线程有一个bean
五、GoF之工厂模式
简单工厂模式(静态 工厂方法模式)
简单工厂模式是工厂方法模式的一种特殊实现。
工厂方法模式
解决了 简单工厂模式违背 ocp的原则
抽象工厂模式
在spring配置文件中直接配置类路径,spring会自动调用该类的无参构造方法。
底层还是new() 创建一个对象
3.通过工厂方法模式
4.实现 接口(惊讶)
接口里可以有默认方法。
这是对第3中方式的优化:spring提供了一个抽象工厂的接口,我们只要去实现这个接口,就创建出了具体的工厂 ,我们通过这个具体的工厂来创建bean.
备注:我们这个具体的工厂 也是一个bean,因为它是通过构造方法创建出来的,是一个特殊的bean,可以去创建普通的bean
通过Factory工厂bean 主要是对普通bean进行加工处理
beanFactory和FactoryBean 的区别
注入自定义Date
1.创建bean
2.属性赋值(即注入)
3.初始化bean ,init方法自己写,自己配,方法名随意
第五步,销毁bean,自己写,自己配,方法名随意
在配置文件中指定 初始化方法和销毁方法。
必须手动关闭spring容器,就是ApplicationContext接口 实现类的close()方法,记得强转一下类型(转成实现类的类型),因为接口没有这个方法。调用close()后,会自动调用 bean指定的销毁方法
在bean初始化,加上 之前,之后这两步
bean后处理器 只作用当前作用域的所有bean
bean后处理器也需要在spring配置文件中注册
新加的3个点位,看是否实现其对应的特定接口,在这三个点位都会去检查bean是否实现了某个接口,则spring容器会调用这个接口中的方法
before之前
before之后
销毁bean之前或者说使用bean之后
点位3实现一系列接口,会有相应的方法。
多例 ,spring容器只管理一部分生命周期,当客户端得到bean后,容器就不再管理该bean
1.什么是循环依赖
A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你,你也依赖我。
曝光
只有bean的scope为singleton 才会进行曝光 ,
多例 + 多例 +set注入
多例 +单例 + set注入
单例+构造注入
构造注入的时候需要赋值。
spring解决循环依赖的机理(精彩)
往map里放bean对象就是曝光的过程,可以在内存中找到它。
再分析下面的源码:
上图,从三级缓存中拿到工厂创建的bean对象后,会将bean对象放到二级缓存中,然后根据beanName把三级缓存中的bean对象删除。
手写spring
com.grin :代表开发
com.myspringframework :代表框架
参考资料:
【文字+图示】Java项目中类路径classpath具体指的是哪个路径_超周到的程序员的博客-CSDN博客