什么是框架:
框架就是将一些重复的重要的代码进行模块化的集成。方便以后直接进行调用,目的来提高开发效率。
SSH: sturs2 spring hibernate
SSM:SpringMVC Spring Mybatis
Spring框架:
Spring的主要目的就是简化代码的开发,并且能够整合现阶段所有的主流框架,起到一个粘合剂的作用。在项目中使用Spring可以一站式的开发编程。编程效率大大提高。其中的IOC和DI以及AOP是Spring的两大核心技术。
Spring的IOC:
IOC叫做控制反转,就是将对象的创建权利发生反转,之前自己手动的创建对象,现在变成由Spring容器帮助创建生成新的对象。从此程序员无需关注对象的创建过程。无需关注对象的生命周期。
Peron p1 = new Person(); ----->自己手动完成
Person p2 = spring容器.get***(); ----->由spring容器创建
Spring的IOC的实现步骤:
0 导入jar包:
1.创建实体类:bean只要被spring管理的对象就是一个bean
2.编写配置文件(1.编写配置文件的头 2编写配置文件的实体内容)
配置文件的名称:最好使用spring默认的名称 applicationContext.xml。
3.启动Spring容器:从容器中获取对象,调用方法完成相应的功能。
Spring对象创建和获取的原理:
spring容器在启动时,需要解析配置文件,配置文件按照逐行解析形式创建对象,根据Bean的class属性,通过反射调用创建对象之后注入在spring容器内部。Spring内部通过map的形式存储已经生成的对象。map中的key就是bean的ID,map中的value就是创建好的对象。
Spring创建对象的机制:
如果在创建对象时,如果出现任何的错误,那么整个spring容器将不会被启动。
Spring中获取对象的方式:
1.通过bean的ID获取对象:
context.getBean("hello"); 其中hello表示bean的ID
2.通过class类型获取对象:context.getBean(Hello.class); 其中的参数表示class类型
说明:虽然通过两种方式都可以获取对象,但是建议大家使用id获取,如果在xml中配置了多个class类型相同的bean那么就会报错。
别名标签alias:
如果想给一个bean器多个名字需要使用别名标签。
创建对象的方式:
1.默认构造方法创建对象(用的最多的)
spring中默认创建对象的方式就是通过无参构造创建对象,所以以后在写构造方法时,一定要加无参构造,这样才能保证程序的正确运行。
2.通过静态工厂创建对象(必须要有静态方法)
静态工厂中,最为关键的部分就是静态方法,如果没有静态方法,那么必然报错。
说明:通过静态方法创建对象,和通过类名.static方法 的方式一致。
3.实例工厂创建对象--先实例工厂,再创建对象
4.spring工厂创建对象
1.spring工厂必须实现FactoryBean
2.实现方法
3.配置文件中的配置
spring创建对象的单例和多例scope:
spring通过容器创建对象时,默认的都是单例的。在spring容器中对象只存在一份,如果使用该对象直接通过getBean()方法获取。
1.在默认条件下对象是单例的
2.scope="singleton" 强制是单例的
3.scope="prototype" 代表多例对象
懒加载:
问题:由于spring在启动时会逐行解析,为每一个bean都会创建对象,这样的方式不是特别高效。
如果容器启动时只创建必须要使用的对象,而其他对象当调用getBean方法时才会被创建,这样的模式更加的高效
懒加载:当什么时候调用getBean方法时对象才会被创建。
说明:在默认条件下spring的懒加载不生效。
lazy-init="false" 懒加载不生效
lazy-init="true" 懒加载生效
default-lazy-init="false" 全局的懒加载配置,如果为false则懒加载不生效,如果为true则全部的bean都懒加载
lazy-init="default" 应该与全局变量配置保持一致。
如果全局变量与lazy-init不一致时以lazy-init为准
当scope遇到lazy-init时的问题(多例就是懒加载):
lazy-init="false" scope="prototype" 设置懒加载不生效,scope为多例的。这时的配置lazy-init将不起任何效果,该配置必然懒加载。(因为spring只负责创建多例,不负责管理多例,所以多例的时候必然懒加载)
在Spring中对象只维护单例对象,只负责单例对象的生命周期,如果对象为多例时,spring只管创建该对象交给用户使用后将不再管理该对象,让该对象自生自灭。
注意:Spring只管单例不管多例,多例对象创建统统懒加载。
自定义初始化和销毁方法:
init-method="自定义方法的名称" 自定义的初始化方法
destroy-method="自定义销毁方法的名称" 自定义的销毁方法,spring在关闭的时候就会调用销毁方法。
容器中对象的生命周期:
1.调用构造方法创建对象
2.调动init方法初始化属性
3.调用目标方法完成相应的功能
4.调用销毁方法做收尾工作。
DI(依赖注入):
依赖注入一般注入可以是基本类型、字符串、对象的引用、集合(List,Set,Map)
注入的方式
1.set方法注入
2.map封装时使用linkedHashMap进行封装,是有序的。
3.为引入类型赋值
通过ref可以为引用类型进行赋值,name是新建的那个引用的名字,ref的值写的是bean的ID
说明:SpringIOC和DI的意义,使用了SpringIOC和DI能够在最大程度上减少代码的耦合性,并且扩展性特别的强。