spring学习笔记(二)API和工厂
环境搭建
- jar包
- 配置文件:
配置文件放置位置没有硬性要求,任意位置
配置文件命名:没有硬性要求,建议 applicationcontext.xml
思考:没有要求所以要进行配置文件路径 的设置
spring核心API
ApplicationContext
作用:工厂,用于对象的创建
好处:解耦合
是一个接口类型
接口:屏蔽实现的差异
非web:ClassPathApplicationContext(main函数或者junit测试)
web:XmlApplicationContext
重量级资源
- ApplicationContext工厂 的对象占用大量内存
- 不会频繁的创建对象:一个应用只会创建一个工厂对象。
- ApplicationContext:一定是线程安全的(多线程并发访问)
程序开发
- 创建类型
- 配置文件的配置,applicationContext.xml
- 通过工厂类,创建对象。
细节分析
名词解释i:spring工厂创建的对象叫做bean或者组件(componet)
Spring工厂的相关方法:
- getbean,通过id获取对象。
有多重重载,如果一起传入了类对象,不需要对返回值强转。
只传入class的getbean方法,就是在配置文件中只能有一个bean标签类型是person类 - getbeannames:可以获取所有的id值
- getbeannamesforType(类):获取所有这个类的ID值
- containsBEANDefinition():判断是否含有
- containsbean()
配置文件注意细节
- 能不能只配置类名?
如果只有一个类的bean是可以的。这个ID会由spring自动生成一个
应用场景:这个bean只需要使用一次,可以省去ID值,如果这个bean使用多次或者被其他bean引用,需要id值。 - name属性
name属性是别名,是小名。
id和name显然不是一样的 ,不然不需要定义两个
相同:获取和定义用id和name是一样的。
区别:id只能有一个值,别名可以定义多个,别名间以逗号分隔。
(从前)xml的id属性值必须要以字母开头,某些整合框架不能完美支持,现在已经可以了id已经修改了这个要求。
name属性不能用containsbeandefinition()判断出来。但是containsbean可以。
spring源码解析简易版
- 先通过工厂,读取配置文件获取id和class信息。
- spring通过类的全限定类名反射创建对象。class.forName
反射创建是否调用构造方法呢?调用! - 通过工厂返回,可以通过getbean获取。
如果构造方法是私有会有影响么?答案是spring仍然会调用到私有的构造方法创建对象,仍然通过反射来实现。
思考
- 所有的对象都交给spring 工厂创建?
理论上是,但是有特例:实体对象(entity)交给持久层,因为不只需要对象,因为需要数据,spring不知数据库的数据。