spring学习笔记(二)API和工厂

环境搭建

  1. jar包
  2. 配置文件:
    配置文件放置位置没有硬性要求,任意位置
    配置文件命名:没有硬性要求,建议 applicationcontext.xml
    思考:没有要求所以要进行配置文件路径 的设置
    spring学习笔记(二)API和工厂

spring核心API

ApplicationContext

作用:工厂,用于对象的创建
好处:解耦合

是一个接口类型
接口:屏蔽实现的差异

非web:ClassPathApplicationContext(main函数或者junit测试)
web:XmlApplicationContext

重量级资源

  1. ApplicationContext工厂 的对象占用大量内存
  2. 不会频繁的创建对象:一个应用只会创建一个工厂对象。
  3. ApplicationContext:一定是线程安全的(多线程并发访问)

程序开发

  1. 创建类型
  2. 配置文件的配置,applicationContext.xml
    spring学习笔记(二)API和工厂
  3. 通过工厂类,创建对象。

spring学习笔记(二)API和工厂

细节分析

名词解释i:spring工厂创建的对象叫做bean或者组件(componet)

Spring工厂的相关方法:

  1. getbean,通过id获取对象。
    有多重重载,如果一起传入了类对象,不需要对返回值强转。
    只传入class的getbean方法,就是在配置文件中只能有一个bean标签类型是person类
  2. getbeannames:可以获取所有的id值
  3. getbeannamesforType(类):获取所有这个类的ID值
  4. containsBEANDefinition():判断是否含有
  5. containsbean()

配置文件注意细节

  1. 能不能只配置类名?
    如果只有一个类的bean是可以的。这个ID会由spring自动生成一个
    应用场景:这个bean只需要使用一次,可以省去ID值,如果这个bean使用多次或者被其他bean引用,需要id值。
  2. name属性
    name属性是别名,是小名。
    id和name显然不是一样的 ,不然不需要定义两个
    相同:获取和定义用id和name是一样的。
    区别:id只能有一个值,别名可以定义多个,别名间以逗号分隔。
    (从前)xml的id属性值必须要以字母开头,某些整合框架不能完美支持,现在已经可以了id已经修改了这个要求。
    name属性不能用containsbeandefinition()判断出来。但是containsbean可以。

spring源码解析简易版

  1. 先通过工厂,读取配置文件获取id和class信息。
  2. spring通过类的全限定类名反射创建对象。class.forName
    反射创建是否调用构造方法呢?调用!
  3. 通过工厂返回,可以通过getbean获取。
    spring学习笔记(二)API和工厂
    如果构造方法是私有会有影响么?答案是spring仍然会调用到私有的构造方法创建对象,仍然通过反射来实现。

思考

  1. 所有的对象都交给spring 工厂创建?
    理论上是,但是有特例:实体对象(entity)交给持久层,因为不只需要对象,因为需要数据,spring不知数据库的数据。