Spring的创始人是个音乐学博士
优点:开源的免费框架、轻量级的非入侵式的框架、控制翻转(IOC)面向切面编程(AOP)、支持事务的处理、对框架整合的支持
组成:
Core AOP ORM DAO Web Context WebMVC
Spring Boot:一个快速开发的脚手架,基于SpringBoot可以快速开发翻个微服务
Spring Cloud:基于SpringBoot实现的
学习SpringBoot的前提是完全掌握Spring和SpringMVC
弊端:发展了太久,违背了原来的理念!配置十分繁琐,人称:配置地狱
2、IOC理论推导
(1)UserDao接口
(2)UserDaoImpl实现类
(3)UserService业务接口
(4)UserServiceImpl业务实现类
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码!如果程序代码量十分大,修改一次的成本代价十分昂贵!
我们使用一个set接口实现:
1 | public UserDao userDao; |
之前程序是主动常见对象!控制权在程序员手上!
使用了set注入后,程序不在具有主动性,而是变成更了被动的接受对象!
这种思想从本质上解决了问题,我们程序员不用再去管理对象的创建了。系统的耦合性大大降低,可以更加专注在业务的实现上!这是IOC的原型!
最大的不同:没有new了!(通过set自动实现了)(所以以前有些代码看不懂)
导入jar包:
1 | <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> |
在resources中创建beans.xml(直接“新建xml”–“spring”)
1 | <?xml version="1.0" encoding="UTF-8"?> |
最终结果:
1 | <?xml version="1.0" encoding="UTF-8"?> |
Hello.java
1 | package com.kuang.pojo; |
MyTest.java
1 | import com.kuang.pojo.Hello; |
结果是输出Hello{str=’Spring’}
读代码技巧:导入idea之后左边有个黄色的圆中间有个叶子就说明这个类被spring托管了,找实例化就要按spring的方式,而不是new!!!
可以尝试追ClassPathXmlApplicationContext的代码,会发现前面有六七层继承才到ApplicationContext,想追到底后面还有
没学过spring之前做题硬读过spring代码,结果追这玩意追了一下午发现卵用没有就放弃了
有参构造:
Hello.java
1 | package com.kuang.pojo; |
方法一(下标赋值):
一般使用这种方法是没有构造器的情况
1 | <?xml version="1.0" encoding="UTF-8"?> |
输出为
1 | 123 |
方法二(类型赋值):
坏处,如果有两个及以上相同类型的参数就会报错(比如两个String),不建议使用!
1 | <?xml version="1.0" encoding="UTF-8"?> |
方法三(直接通过参数名设置):
1 | <?xml version="1.0" encoding="UTF-8"?> |
5、Spring配置
bean
beans
alias
description(描述,没什么用)
import
5.1 别名(alias)
1 | <alias name="hello" alias="hello1"/> |
然后就可以用hello1代指hello进行操作了(hello也能用)
5.2 bean的配置
id:bean的唯一标识符,也就是相当于我们学的对象名
class:bean对象所对应的全限定名:报名+类型
name:也是别名(可以代指原来的id),相当于alias,可以通过空格、逗号、分号分割创建多个别名
5.3 import
一般用于团队开发使用,它可以将多个配置文件,导入合并为一个
利用import将所有人的beans.xml合并为一个总的
6、依赖注入
6.1 构造器注入
6.2 Set方式注入
依赖:bean对象的创建依赖于容器
注入:bean对象的所有属性,由容器来注入
Student.java
1 | package com.kuang.pojo; |
Address.java
1 | package com.kuang.pojo; |
beans.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
MyTest.java
1 | import com.kuang.pojo.Student; |
输出:Student{name='scr', address=Addresss{address='j'}, books=[红楼梦, 西游记, 水浒传, 三国演义], hobbies=[听歌, 看电影, 敲代码], card={身份证=111, 银行卡=222}, games=[LOL, COC, BOB], info={姓名=scr, 学号=2022, 性别=男}, wife='null'}
另:这就是传说中的“配置地狱”
6.3 拓展方式注入(需要先导入约束)
p命名空间
c命名空间
User.java
1 | package com.kuang.pojo; |
导入包:
1 | <dependency> |
p命名空间:
添加```xmlns:p="http://www.springframework.org/schema/p"```
1 | <?xml version="1.0" encoding="UTF-8"?> |
c命名空间:
添加```xmlns:c="http://www.springframework.org/schema/c"```
1 | <!--c命名空间注入,通过构造器注入:construct-args--> |
6.4 bean的作用域
scope参数
1 | <bean id="user" class="com.kuang.pojo.User" c:name="scr" c:age="18" scope=""> |
singleton(默认)
单例模式
1 | //获取Spring的上下文对象 |
返回值为true
虽然拿出对象是多个,但是指向同一个实体类
prototype
原型模式
1 | <bean id="user" class="com.kuang.pojo.User" c:name="scr" c:age="18" scope="prototype"> |
1 | //获取Spring的上下文对象 |
返回值为false,两个对象不一样,每次从容器中get的时候都会产生一个新对象(地址不一样)
其余的request,session,application这些只能在web开发中使用到
7、Bean的自动装配
自动装配是Spring满足bean依赖的一种方式
Spring会在上下文中自动寻找,并自动给bean装配属性
在Spring中有三种自动装配的方式:
(1)在xml中显示的配置
(2)在java中显示配置
(3)隐式的自动装配bean
7.1 测试
Cat.class
1 | package com.kuang.pojo; |
Dog.class
1 | package com.kuang.pojo; |
People.class
1 | package com.kuang.pojo; |
beans.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
MyTest.class
1 | import com.kuang.pojo.People; |
7.2 ByName自动装配
byname:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid
beans.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
7.3 ByType
byname:会自动在容器上下文中查找,和自己对象属性类型相同的beanid(必须保证这个类型只有一个)
1 | <?xml version="1.0" encoding="UTF-8"?> |
7.4 注解
jdk1.5支持注解
spring2.5支持注解
1.导入约束:context约束
2.配置注解的支持:
xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
@Autowired直接在属性上用即可(连set方法都可以去掉,利用反射,前提是这个自动装配的属性在IOC(SpRing)中创业板在,且名字符合byname(或bytype,会先找bytype,然后找byname))
People.java:
1 | package com.kuang.pojo; |
beans,xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
科普:
@Nullable 字段标记了这个注解,说明这个字段可以为null
@Autowired(required = false) 如果显示定义了Autowired的required属性为false,说明这个队形可以为null,否则不允许为空
8.使用注解开发
在spring4之后要使用注解开发,必须要保证aop的包导入了
使用注解需要导入context约束,增加注解支持
1.bean
2.属性如何注入
3.衍生的注解
4.自动装配
5.作用域
6.小结
applicationContext.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
User.java
1 | package com.kuang.pojo; |
9.使用java的方式配置Spring
完全不使用Spring的xml配置,全权交给Java来做
JavaConfig是Spring的一个子项目,在Spring4之后他成为了一个核心功能
User.java
1 | package com.kuang.pojo; |
KuangConfig.java
1 | package com.kuang.config; |
MyTest.java
1 | import com.kuang.config.KuangConfig; |
这种纯Java的配置方式,在SpringBoot中随处可见
10.代理模式
为什么要学习代理模式?因为这是SpringAOP的底层(SPringAOP,SPringMVC)
代理模式分类:
静态代理
动态代理:分为两大类:基于接口,基于类
基于接口—JDK动态代理(我们在这里使用)
基于类:cglib
java字节码实现:javassist
需要了解两个类:proxy,InvocationHandler:调用处理程序
Host.java
1 | package com.kuang.demo03; |
Rent.java
1 | package com.kuang.demo03; |
ProxyInvocationHandler.java
1 | package com.kuang.demo03; |
Client.java
1 | package com.kuang.demo03; |
编写公式:(target和object可以随意更改)
1 | package com.kuang.demo04; |
11.3 使用Spring实现AOP
方式一:API接口:
(重点)使用AOP织入,需要导入一个依赖包
1 | <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> |
UserService.java
1 | package com.kuang.service; |
UserServiceImpl.java
1 | package com.kuang.service; |
Log.java
1 | package com.kuang.log; |
AfterLog.java
1 | package com.kuang.log; |
applicationContext.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
MyTest.java
1 | import com.kuang.service.UserService; |
方法二:自定义类
DitPointCut.java
1 | package com.kuang.diy; |
applicationContext.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
MyTest.java
1 | import com.kuang.service.UserService; |
方式三:使用注解实现
AnnotationPointCut.java
1 | package com.kuang.diy; |
applicationContext.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
MyTest.java
1 | import com.kuang.service.UserService; |
12.MyBatis-SPring和事务
略吧,以后有用再回来
v1.5.2