一文带你学习 Spring 框架从入门到精通,通向架构师道路的必经之学
今日分享开始啦,请大家多多指教~
第一章:认识 Spring
Spring 认识框架
spring 全家桶: spring ,springmvc,spring boot,spring cloud
spring:出现在 2002 左右,解决企业开发的难度,减轻对项目模块之间的管理。
类和类之间的管理,帮助开发人员创建对象,管理对象之间的关系。
spring 核心技术 ioc ,aop 。能实现模块之间,类之间的解耦合。
依赖: classa 中使用 classb 的属性或者方法,叫做 classa 依赖 classb。
Spring 框架内部模块
第二章 IoC 控制反转
IoC 概念
框架怎么学:框架是一个软件,是其它人写好的软件。知道框架能干啥, 具体的使用步要就行。
1)知道框架能做什么,mybatis--访问数据库, 对表中的数据执行增删改查。
2)框架的语法,框架要完成一个功能,需要一定的步骤支持的。
3)框架的内部实现,框架内部怎么做,原理是什么。
4)通过学习,可以实现一个框架。
spring 的第一个核心功能 ioc
IOC (Inversion of Control) :控制反转,是一个理论,概念,思想。
描述的:把对象的创建,赋值,管理工作都交给代码之外的容器实现,也就是对象的创建是有其它外部资源完成。
控制:创建对象,对象的属性赋值,对象之间的关系管理。
反转:把原来的开发人员管理,创建对象的权限转移给代码之外的容器实现。由容器代替开发人员管理对象。创建对象,给属性赋值。正转:由开发人员在代码中,使用 new 构造方法创建对象,开发人员主动管理对象。
public static void main(string args[]){student student - new Student();//在代码中, 创建对象。--正转。
}
容器:是一个服务器软件,一 个框架(spring)
为什么要使用 ioc :目的就是减少对代码的改动,也能实现不同的功能。实现解耦合。
创建对象的方式
为什么要使用 ioc :目的就是减少对代码的改动,也能实现不同的功能。实现解耦合。
java 中创建对象有哪些方式:
1.构造方法,new student ( )
2.反射
3.序列化
4.克隆
5.ioc。容器创建对象
6.动态代理,利用反射机制在运行时创建代理类。
IoC 的实现技术
ioc 的体现:servlet
1.创建类继承 HttpServelt2.web.xml 注册 servlet ,使用<servlet-name> myservlet </ servlet-name><servelt-class>com.bjpwernode.controller.MyServlet1</servlet-class>3.没有创建 Servlet 对象,没有 MyServlet myservlet = new MyServlet ()4. Servlet 是 Tomcat 服务器它能你创建的。Tomcat 也称为容器。Tomcat 作为容器:里面存放的有 Servlet 对象,Listener ,Fil ter 对象 IoC 的技术实现
DT 是 inc 的技术实现
DI ( Dependency Injection) : 依赖注入,只需要在程序中提供要使用的对象名称就可以,至
赋值,查找都由容器内部实现。
spring 是使用的 di 实现了 ioc 的功能,spring 底层创建对象,使用的是反射机制。
第一个例子创建对象
创建 spring 配置文件
创建容器对象 ApplicaitonContext【拿到 spring 创建的对象】
spring 创建对象的时机
获取容器中对象信息的 api
创建非自定义对象
设值注入概念【注入就是赋值】
ch02-di-xml:在 spring 的配置文件中,给 java 对象的属性赋值。
di:依赖注入,表示创建对象,给属性赋值。
di 的实现有两种:
1.在 spring 的配置文件中,使用标签和属性完成,叫做基于 XML 的 di 实现。
2.使用 spring 中的注解,完成属性赋值,叫做基于注解的 id 实现。
di 的语法分类:
1. set 注入(设置注入) : spring 调用类的 set 方法,在 set 方法可以实现属性的赋值。
80 左右都是使用的 set 注入。
2.构造注入,spring 调用类的有参数构造方法,创建对象。在构造方法中完成赋值。
简单类型的设值注入实现
单元测试 junit
就是因为在 main 文件中测试不方便,不能独立测试每一个方法,所以提出单元测试。
junit :单元测试,一个工具类库,做测试方法使用的。
单元:指定的是方法,一个类中有很多方法,一个方法称为单元。
使用单元测试
1.需要加入 junit 依赖。
<dependency>
<groupId>junit</groupId>
<arti factId> junit </arti factId><version>4.11</version>
<scope>test</ scope>
</ dependency>
2.创建测试作用的类:叫做测试类
src/ test/java 目录中创建类
3.创建测试方法
1) public 玩法
2)没有返回值 void
3)方法名称自定义,建议名称是 test +你要测试万法名称
4)方法没有参数
5)方法的上面加入 @Test,这样的方法是可以单独执行的。不用使用 main 方法。
设值注入【set 注入】的注意事项
设值注入只是使用 set 方法
xml 文件规定,所有的属性必须放在引号中,int 类型的数据也一样。
设值注入也可以给别人写的类进行赋值,只要有对用的 set 方法就行。
引用类型的设值注入
构造注入
构造注入是指,在构造调用者实例的同时,完成被调用者的实例化。即使用构造器设置依赖关系。
还可以省略 index。
构造注入创建文件对象
复习第一天内容【思维导图】
IoC 作业
自动注入 byName
简化对于引用类型的重复赋值,减少冗余。
自动注入 byType
2. byType(按类型注入) : java 类中引用类型的数据类型和 spring 容器中(配置文件) <bean>的 class 是同源关系的,这样的 bean 能够赋值给引用类型。
同源就是一类的意思:
1.java 类中引用类型的数据类型和 bean 的 class 的值是样的。
2.java 类中引用类型的数据类型和 bean 的 class 的值父子类关系的。
3.java 类中引用类型的数据类型和 bean 的 class 的值接口和实现类关系的
语法:
<bean id="xx" class="yyy" autowire= "byType">
简单类型属性赋值
</bean>
为什么使用多配置文件
大型项目中,需要多个配置文件。
多个配置优势
1.每个文件的大小比一个文件要小很多,效率高。
2.避免多入竞争带来的冲突。
如果你的项目有多个模块(相关的功能在一起),一个模块一个配置文件。
学生考勤模块一个配置文件,张三
学生成绩一个配置文件,李四
多文件的分配方式:
1.按功能模块,一个模块一个配置文件
2.按类的功能,数据库相关的配置一个文件配置文件,做事务的功能一个配置文件,做 service 功能的一个配置文件等。
包含关系的配置文件
注解的使用步骤
基于注解的 di:通过注解完成 java 对象创建,属性赋值。
使用注解的步骤:
1.加入 maven 的依赖 spring-context ,在你加入 spring- context 的同时,间接加入 spring- aop 的依赖,使用注解必须使用 spring-aop 依赖。
2.在类中加入 spring 的注解(多个不同功能的注解)
3.在 spring 的配置文件中,加入一个组件扫描器的标签,说明注解在你的项目中的位置。
学习的注解:
1.@Component
2.@Respotory
3.@service
4.@Controller
5.@value
6.@Autowired
7.@Resource
Component 注解使用
组件扫描器
多注解项目分层
@Component(value = "myStudent ")等同于
<bean id= "myStudent" class="com.bjpowernode.ba01.Student" />
spring 中和 @Component 功能一致,创建对象的注解还有:
1. @Repository (用在持久层类的上面) :放在 da 的实现类上面,表示创建 dao 对象,dao 对象是能访问数据库的。
2.@Service(用在业务层类的上面) :放在 service 的实现类上面,创建 service 对象,service 对象是做业务处理,可以有事务等功能的。
3. @Controller(用在控制器的上面) :放在控制器(处理器)类的上面,创建控制器对象的,控制器对象,能够接受用户提交的参数,显示请求的处理结果。
以上三个注解的使用语法和 @Component 一样的。都能创建对象,但是这三个注解还有额外的功能。
@Repository,@service , @Controller 是给项目的对象分层的。
不清楚要用上面三个注解的情况就用 @Component。
扫描多个包的方法
简单类型属性赋值
引用类型属性赋值 AutoWired 自动注入,使用 byType
步骤:首先扫描配置文件 ApplicaitonContext,使用组件扫描器扫描 base-package,创建包中所有对象,根据其中的注解注入【赋值】。
引用类型属性赋值 AutoWired 自动注入,使用 byName
比较
引用类型 AutoWired 的 required 属性
引用类型
@Autowired:spring 框架提供的注解,实现引用类型的赋值。
spring 中通过注解给引用类型赋值,使用的是自动注入原理, 支持 byName, byType。
@Autowired:默认使用的是 byType 自动注入。
属性:required,是 一个 boolean 类型的,默认 true。
required=true :表示引用类型赋值失败,程序报错,并终止执行。
required=false :引用类型如果赋值失败,程序正常执行,引用类型是 null。
引用类型 AutoWired 的 required 属性推荐使用默认值 true
使用 true, 尽早解决程序中的问题,报错。
引用类型 Resource
Resource 是来自于 JDK 中的注解,不是来自于 spring 的。
引用类型
@Resource:来自 jdk 中的注解,spring 框架提供 J 对这个注解的功能支持,可以使用它给引用类型赋值。使用的也是自动注入原理,支持 byName ,byType ,默认是 byName。
位置: 1. 在属性定义的上面,无需 set 方法,推荐使用。
2.在 set 方法的上面
//默认是 byNamel
@Resource
xml 配置文件和注解的对比
经常改的就是使用 xml 配置文件、不经常改的就使用注解。
注解为主,配置文件为辅
复习【控制反转】
复习动态代理的实现方式
使用动态代理的目的是在不改变原先类的基础上,对其进行功能增强。
JDK 动态代理
动态代理的实现方式常用的有两种:使用 JDK 的 Proxy,与通过 CGLIB 生成代理。Jdk 的动态要求目标对象必须实现接口,这是 java 设计上的要求。
从 jdk1.3 以来,java 语言通过 java.lang.reflect 包提供三个类支持代理模式 Proxy,Method 和 InovcationHandler。
CGLIB 动态代理(了解)
CGLIB 的要求更低
CGLIB(Code Generation Library)是一个开源项目。是一个强大的,高性能,高质量的 Code 生成类库,它可以在运行期扩展 Java 类与实现 Java 接口。它广泛地被许多 AOP 的框架使用,例如 Spring AOP。
使用 JDK 的 Proxy 实现代理,要求目标类与代理类实现相同的接口。若目标类不存在接口,则无法使用该方式实现。但对于无接口的类,要为其创建动态代理,就要使用 CGLIB 来实现。.
CGLIB 代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。所以,使用 CGLIB 生成动态代理,要求目标类必须能够被继承,即不能是 final 的类。
CGLIB 经常被应用在框架中,例如 Spring ,Hibernate 等。cglib 的代理效率高于 Jdk。项目中直接使用动态代理的地方不多。一般都使用框架提供的功能。
用注解实现 Ioc 作业
1、加入依赖
2、创建类,在类中加入注解
3、声名组件扫描器
使用动态代理实现一个功能增强
今日份分享已结束,请大家多多包涵和指点!
评论