一、Spring框架所需的jar包
二、Spring的配置文件applicationContext.xml
配置文件放在【classpath】目录下,即src下,配置文件的截图如下
Question:What is classpath?克拉斯帕斯是瓦特?
三、Spring之HelloWorld
学习Spring的原因:代码开发完以后,如果需要修改,尽量不动源代码,只修改配置文件
Ⅰ、添加jar包
让Eclipse中的所有Spring相关的练习公用一份jar包——>新建user Library
jar包的介绍
jar包名字 | 说明 |
---|---|
aspectjweaver-1.9.4.jar | aop(必须的工具包) |
hamcrest-core-1.3.jar | junit(单元测试) |
junit-4.12.jar | |
log4j-api-2.12.1.jar | log4j(Java日志) |
log4j-core-2.12.1.jar | |
spring-aop-5.2.1.RELEASE.jar | spring(AOP) |
spring-aspects-5.2.1.RELEASE.jar | |
spring-beans-5.2.1.RELEASE.jar | spring(IOC) |
spring-context-5.2.1.RELEASE.jar | |
spring-context-support-5.2.1.RELEASE.jar | |
spring-core-5.2.1.RELEASE.jar | |
spring-expression-5.2.1.RELEASE.jar | 表达式 |
spring-instrument-5.2.1.RELEASE.jar | |
spring-jcl-5.2.1.RELEASE.jar | |
spring-jdbc-5.2.1.RELEASE.jar | spring封装了JDBC |
spring-jms-5.2.1.RELEASE.jar | javaMessageSystem |
spring-orm-5.2.1.RELEASE.jar | ORM:框架 |
spring-tx-5.2.1.RELEASE.jar | tx:事务管理器 |
spring-web-5.2.1.RELEASE.jar | web:封装了Servlet |
spring-webmvc-5.2.1.RELEASE.jar | springmvc所需要的包 |
Ⅱ、Spring的配置文件【applicationContext.xml】
A、配置文件的位置
B、配置文件一览
Ⅲ、Spring的测试类BaseTest.java
Ⅰ、加载配置文件
通过【ClassPathXmlApplicationContext】加载【classpath】下的配置文件【applicationContext.xml】
【BaseTest】
运行正常的结果
可能出现的异常
原因
四、IOC:Inversion【反转】 Of Control【控制】
正转:没有Spring的时候,码代码的步骤:
Ⅰ、创建一个类【java源文件】
Ⅱ、定义属性和方法【类的两个要素】
Ⅲ、在测试类的【main】函数中New对象
Ⅳ、为属性赋值【注:Spring将会对(Ⅲ、Ⅳ)进行管理】
Ⅴ、调用属性
Ⅵ、调用方法
【加背景色的部分】被Spring收回,交给Spring来做
IOC其实就是一个容器【Container】,放的是多个bean,通过【id】快速找到【class】对应的对象【底层是一个map】
IOC:控制反转,使用Spring
Ⅰ、创建一个类【java源文件】
Ⅱ、定义属性和方法【类的两个要素】
Ⅲ、在测试类的【main】函数中New对象——>【在配置文件applicationContext.xml中处理】
Ⅳ、为属性赋值【注:Spring将会对(Ⅲ、Ⅳ)进行管理】——>【Dependency Injection】依赖注入
// TODO 用Spring DI 为POJO类的属性赋值
Ⅴ、调用属性
Ⅵ、调用方法
五、Dependency【依赖】Injection【注入】:依赖注入
【依赖】:A类使用的时候需要先操作B类
【注入】:其本质即赋值
【测试】
【测试结果】:
Ⅰ、使用【this.ac.getBean()】和【<bean>的id值】的返回值的【toString】中【hashCode】一样,即为同一对象
Ⅱ、默认创建的对象都是【单例】——>singleton【单例】
A、使用Spring创建对象
Q:如何创建单例【多例】对象 ?
用Spring创建单例【多例】总结:
在<bean>标签中控制创建单例【多例】的属性:scope=" "【singleton[默认:单例]/prototype[多例] 】
Q:Spring创建对象的方法 ?
Ⅰ、通过Spring配置文件的<bean>标签
Ⅱ、通过工厂创建对象
通过工厂创建对象步骤:
Ⅰ、创建工厂类
Ⅱ、配置文件:【factory-bean】关联【bean的id】和【factory-method】关联工厂类的方法名【createFactory】
B、使用Spring赋值
在未使用Spring时为类的属性赋值需要先new对象
在Spring的配置文件中的【<bean id="#" class="类的全限定名">】就相当于【类名 对象名 = new 类的构造方法()】
Q:【测试】Spring配置文件中的<bean>标签是否执行类的构造方法 ?
【测试总结】
Ⅰ、不管测试类是否获取配置文件中【<bean>】,配置文件中的【<bean>】都会创建【类全限定名】指向的类的对象
Ⅱ、当 scope="prototype" 【多例】时,每获取一次【<bean>】,就会创建一个对象
Q:Spring创建对象默认调用无参的构造方法,
Ⅰ、通过【init-method】可以指定初始化调用的方法。
Ⅱ、通过【destory-method】 可以指定哪个方法作为结束 [销毁] 时调用的方法
Spring赋值的方法
总结
【Ⅰ、通过构造器赋值的方法】
三种赋值方法的对比 第一种:按照形参的下标索引值赋值;方法的重载;必须要求有参构造方法的形参的个数不一样 如果形参的个数一样;数据类型不一样,通过下标赋值容易【驴唇不对马嘴】,类型不匹配
第二种:按照形参的数据类型进行赋值;方法的重载;必须要求形参的数据类型不一样 如果形参的数据类型一样;形参个数不一样,通过数据类型赋值容易【张冠李戴】
第三种:通过形参的名称进行赋值; 【推荐使用】 方法有多个形参,名字不一样,形参的顺序可以调换
【Ⅱ、通过读写器赋值的方法】
通过<property>标签进行赋值,详见示例
【Ⅲ、其他赋值的方法】
a、使用P为属性赋值,P:后面的是属性名,不能随便填写
b、通过属性文件【.properties】为属性赋值
Spring赋值的示例
Ⅰ、通过构造方法赋值
a、通过有参构造方法【形参的下标 [索引] 值】为类的属性赋值
b、通过有参构造方法【形参的数据类型】为类的属性赋值
c、通过有参构造方法【形参的名称】为类的属性赋值
Ⅱ、通过读写器赋值【Setter和Getter方法】
为基本数据类型,引用数据类型,自定义引用类型的属性赋值
基本数据类型+引用数据类型
自定义引用类型
Ⅲ、其他的赋值方法
a、使用P为属性赋值,P:后面的是属性名,不能随便填写
b、通过属性文件【.properties】为属性赋值
六、加载多个Spring的配置文件
Ⅰ、在使用【ClassPathXmlApplicationContext】加载配置文件时设置配置文件的统一格式
要求:
a、所有的配置文件都在classpath下
b、配置文件的命名符合"applicationContext_*.xml",如:
Ⅱ、在核心的配置文件中通过 【import】标签 引入其他的配置文件
七、Spring的注解
A、Spring注解的使用
Ⅰ、先配置【applicationContext.xml】文件
Ⅱ、再使用注解
【注:注解和XML的功能是一模一样的,注解的功能在步步的追赶XML】
XML:在编译的时候会原样拷贝到classpath中,而注解是写在Java代码中的,在编译的时候会编译成class文件(加密),
需要在Java源文件【源代码中修改】
配置文件:这里存储的是经常修改的部分;不经常修改的配置放到注解中【注:强烈不建议使用注解】
B、自动装配
C、【未使用注解的测试】
Ⅰ、测试的包的结构分层
Ⅱ、源码
【POJO】类没有用到,故略。
【Dao层】
【Dao的实现类】
【Service层】
【Service的实现类】
【applicationContext.xml】
【测试类及运行结果】
D、【使用注解的测试】
【配置文件】
【Service实现类的注解】
【Dao实现类的注解】
使用注解的总结:
Ⅰ、在配置文件中,设置默认自动装配方式为按照名称自动装配
Ⅱ、在配置文件中,设置注解所在的包
Ⅲ、在属性上写注解的时候,不需要使用读写器,
@Resource: 去Spring的IOC容器找bean的名字为demoDynastyDao的Bean,
如果找不到就去找【IADemoDynastyDao】的子类[实现类],实现类需要写注解 @Repository
@Autowired: 按照类型去装配,先按照属性名去找bean的id为demoDynastyDao,找不到就按照类型去找
@Autowired和@Resource效果一样
建议:把dao的名字和属性名一样(如果不一样,会按照类型去找,如果子类多个,就会报错)
jar包使用小技巧
在以往使用【build path】配置【jar包】是这样的:
如果jar包多了,显得有些乱,并且有时候有些jar包用不上,则会占用空间,
所以对jar包进行分类,用一个“盒子”在整理归类,归类方法如下图所示: