Spring学习笔记1Sring初接触1.1Spring是什么1.Spring是一个开源框架.2.Spring为简化企业级应用开发而生.使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能.3.Spring是一个IOC(DI)和AOP容器框架.1.2Spring的作用1)用来整合其他框架,可以让程序的结构更为松散,实现低耦合2)简化事务控制,实现声明式事务(相对于编程式事务来言)1.3具体描述具体描述Spring:轻量级:Spring是非侵入性的-基于Spring开发的应用中的对象可以不依赖于Spring的API依赖注入(DI---dependencyinjection、IOC)面向切面编程(AOP---aspectorientedprogramming)容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期框架:Spring实现了使用简单的组件配置组合成一个复杂的应用.在Spring中可以使用XML和Java注解组合这些对象一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上Spring自身也提供了展现层的SpringMVC和持久层的SpringJDBC)1.4Spring模块组成1.5两个核心思想:1.5.1IOC&DI:IOC控制反转InversionofControl所谓的IOC:是指将某一类对象的控制权(对象创建和方法调用)交给外部容器来负责。DI:依赖注入DependencyInject所谓DI:对象依赖的属性,由容器给此属性赋值的过程1.5.2AOPaop:面向切面编程1.6第一个spring程序1.6.1添加spring核心依赖库spring运行依赖于spring库,在maven中配置核心依赖如下:!--添加spring的核心依赖库core--dependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactIdversion4.2.5.RELEASE/version/dependency!--添加spring的核心依赖库beans--dependencygroupIdorg.springframework/groupIdartifactIdspring-beans/artifactIdversion4.2.5.RELEASE/version/dependency!--添加spring的核心依赖库context--dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion4.2.5.RELEASE/version/dependency1.6.2创建spring的全局配置文件applicationContext.xml在resouces目录下新建spring的配置文件applicationContext.xml1.6.3编写测试类,测试spring环境是否搭建成功若环境成功搭建,数据结果为非空,如下:1.7IOC控制反转在spring之前,我们程序中需要一个对象实例是直接通过new的方式来创建,或者通过对象工厂的方式来创建,而在spring中,是通过IOC控制反转的方式来创建实例,简单来说就是不用显示的new对象,而是将对象的创建交给spring来实现。这样对象创建的控制权就由应用内转向了应用外,由此形成控制反转。1.7.1先在包com.deng.spring.bean中建立一个类Human。1.7.2接下来,在spring的配置文件applicationContext.xml中配置该类的实例PS:通过bean标签来定义实例,class属性指定类的全限定类名,id为唯一标识,在整个应用内id应该唯一。1.7.3下一步,在测试类中,我们通过spring的控制反转来获取一个该类的实例,并调用该实例的say方法由此可见,使用spring后,对象的创建不再是由程序内部来控制,而是交给spring容器来管理。PS:在spring'中,从容器中获取对象的实例的方式有以下两种方式:1.通过bean的id属性来获取,以上的例子就是采用此方式2.通过实例的类类型来获取,如下例子所示1.7.4bean的作用域(重点)spring中的bean默认为单例模式,即spring容器创建的bean在整个应用声明周期内,仅有一个实例,若需要修改为非单例模式可以通过为bean的scope属性指定值prototype实现。1.7.5bean的生命周期生命周期指的的bean实例从创建到销毁的整个过程,通过spring提供的回调方法实现。定义bean时指定两个回调方法,控制bean的初始化和销毁时的动作。Init-method:定义初始化的时候的回调方法,该方法会在实例初始化完成后及时执行,即在构造方法之后执行;Destory-mehtod:定义对象销毁时的回调方法,该方法会在实例被销毁的时候执行。Human.javaapplicationContext.xml测试代码:结果:注意结果:销毁的方法仅针对单例模式起作用,对于非单例模式无效。1.8DI依赖注入在spring之前,我们要为对象实例的属性设置值,一般是通过1.为属性提供setter方法,然后通过对象实例的setter方法设置值;2.在程序中,通过构造方法为对象的属性设置值但是不管采用哪种方式,均是在应用内为属性设置值,程序深度耦合,而在spring中可以将该工作交由spring来完成,让程序在运行期,由外部容器(spring)动态地将依赖对象注入到组件中1.8.1为前面例子的Human类定义属性name,age并提供setter方法1.8.2在spring配置文件applicationContext.xml中通过控制反转为name和age属性注入值。PS:spring中通过bean的子标签properties为属性注入值,其中name为Human类中定义的属性,value为具体注入的值。1.8.3通过测试类来测试say方法,以确定是否正确为name和age属性注入值可见,测试方法未发生变更,执行结果为:1.8.4PS:在spring中,bean的属性注入有2种方式:1.基于setter方法注入,上面的实例就是通过setter方法注入2.基于构造方法注入,下面的实例为通过构造方法注入a)为human类定义带参数的构造方法(着重)b)在spring配置文件中通过构造方法来注入属性(了解)上面的方式为基于构造方法的参数的索引位置实现注入,下面的是通过参数名的方式进行注入,推荐第二种方式。1.8.5为bean属性注入不同类型的值1.8.5.1String类型,普通数据类型1.在类中定义待注入的属性2.为每个属性提供setter方法3.在bean中通过propertyname=namevalue=lily/注入1.8.5.2引用数据类型(对象)1.在类中定义待注入的属性,比如father2.为属性提供setter方法3.在spring中通过bean定义待注入的对象4.在bean的属性注入是,通过ref应用对应的资源ref=”beanId/beanName”1.8.5.3集合注入spring中处理的集合包含:List,Set,Map,Properties,数组Human类中定义集合类型属性,以及对应的setter方法spring配置文件中注入方式如下:propertyname=listlistvalue1/valuevalue2/valuevalue4/valuevalue5/value/list/propertypropertyname=setsetvaluea/valuevalueb/valuevaluec/value/set/propertypropertyname=mapmapentrykeyvaluekey1/value/keyvaluevalue1/value/entryentrykeyvaluekey2/value/keyvaluevalue2/value/entry/map/propertypropertyname=propertiespropspropkey=k1v1/proppropkey=k2v2/prop/props/propertypropertyname=arrsarrayvaluestr1/valuevaluestr2/valuevaluestr3/value/array/propertyPS:若集合元素是一个应用类型,则将value变更为refbean=被注入的对象的名称/1.9spring案例需求:利用spring来装配手机系统,手机系统中涉及到的对象有1.手机对象2.CPU3.内存4.SSD闪存5.显示屏6.摄像头手机由cpu、内存、ssd闪存、显示屏、摄像头所组成,要求基于组件的方式来设计手机。1.9.1实现方案step1.定义相关组件的接口定义CPU接口定义显示器接口定义手机定义CPU的实现类:定义显示器的实现类:1.9.2Setp2.通过spring来装配手机(利用spring来管理对象的创建和实例)在applicationContext.xml中定义1.9.3编写测试类,获取一个手机实例,测试手机运行1.9.4留后:请完成其他组件的定义和装配2spring进阶2.1使用自动装配属性在1.9的案例中,我们手机的cpu和显示器的属性引用都是通过显示的定义引用的方式实现的,在spring2.5以后,提供了自动装配(autowired)的功能。2.1.1在xmp中实现自动装配PS:通过在bean中,增加属性autowire来实现该bean的属性的自动装配,若指定该属性,spring容器将会根据指定的自动装配策略在spring容器中寻找满足条件的外部实例装配到当前bean实例中。自动装配策略包含:byType:根据属性类型自动装配,此时需要注意整个spring容器中不能出现多个同类型的bean;byName:根据属性的名称自动装配,要求当前bean实例中的属性名和待装配的bean实例的name属性一致;2.1.2基于注解的方式实现自动装配1.首先在xml文件中无需为phone的cpu和display属性指定引用,也不必指定bean的autowire属性;2.在Phone类中,通过注解@Autowire设置属性cpu和display为自动装配。3.执行测试代码原因分析:cpu和display属性为正确的注入外部引用。4.解决方案若是采用了注解的方式来实现自动装配,需要在spring配置文件中指定自动包扫描配置,当且仅当你的注解是定义在自动扫描包范围内时,自动装配才会被执行。2.1.2.1开启context空间的支持:在spring配置文件的xml头声明中增加context空间支持,注意顺序不能乱了2.1.2.2开启自动扫描功能,并指定自动扫描的包路劲PS:自动扫描包可以包含多个,用英文逗号分隔,自动扫描包含包本身以及其所有的子包。2.1.2.3再次执行查看结果2.2使用注解的方式配置beanSpring从2.5版本开始引入了基于注解驱动的方式来进行bean的配置,但在使用过程中,需要先配置自动扫描的目录,请参考章节2.1.22.2.1配置Bean使用@Component注解如需为Bean定义名称,在参数中添加Bean名称@Component(beanName)示例如下:测试类代码:PS:使用注解的方式来配置bean,要求类必须要有不带参数的