环境搭建
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不知数据库的数据。