1:简介:
- spring:春天 -----》给软件行业带来了春天
- 2002,首次推出了spring框架的雏形:interface21框架
- 2004年3月21日发布
- Rod Johnson
- spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架
- SSH:Struct2 + spring + Hiberbate!
- SSM:springMVC + spring + Mybatis
官网:https://spring.io/projects/spring-framework#overview
官方下载地址:https://repo.spring.io/ui/native/release/org/springframework/spring
guihub地址:https://github.com/spring-projects/spring-framework
1.2:优点
- spring是一个开源的免费的框架(容器)
- spring是一个轻量级、非入侵式的框架
- 控制反转(IOC),面向切面编程(AOP)
- 支持事务的处理,对框架整合的支持
总结:spring就是一个轻量级的控制反转和面向切面编程的框架
1.3:组成
7大模块:
1.4:拓展
现代化的java开发!基于spring的开发
- springboot
- 一个快速开发的脚手架
- 基于springboot可以快速的开发单个微服务
- 约定大于配置
- springcloud
- springcloud是基于springboot实现的
现在大多数公司都在使用springboot进行快速开发,学习springboot的前提:需要完全掌握spring和springMVC!承上启下的作用!
弊端:发展太久之后就违背了原来的理念!配置十分烦琐。
2:IOC理论推导
- userDao接口
- userDaoImpl实现类
- userService业务接口
- userServiceImpl业务实现类
原本:用户的需求会导致业务层的及数据层的代码大量变动程序注定创建对 象,控制权在程序员身上
现在:使用一个set接口实现:使用set注入,程序不再具有主动性,而是变成了被动的接收对象
private UserDao userDao;
//利用set进行动态是实现值的注入!
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
这种思想从本质上解决了问题,我们程序员不用再去管理对象的创建。系统的耦合性减低,可以更加专注于业务的实现!这是IOC的原型!
IOC本质
在面向对象编程中,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制。
控制反转后将对象的创建移给第三方,所谓的控制反转就是:获取依赖对象的方式反转了
3:helloSpring
bean文件配置骨架
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
4:IOC创建对象的方式
-
使用无参构造方法创建对象 默认!
-
使用有参构造方法
-
下标赋值
<!-- 下标赋值--> <bean id="user" class="com.chen.pojo.User"> <constructor-arg index="0" value="chen"/> </bean>
-
类型
<!-- 不建议使用 通过参数类型匹配--> <bean id="user" class="com.chen.pojo.User"> <constructor-arg type="java.lang.String" value="yu"/> </bean>
-
参数名
<!-- 直接通过参数名 --> <bean id="user" class="com.chen.pojo.User"> <constructor-arg name="name" value="xing"/> </bean>
-
总结:在配置文件加载的时候,容器中管理的对象已经被创建了!
5:spring配置
5.1:别名:
<!-- 别名-->
<alias name="user" alias="dsds"/>
5.2:bean的配置
<!-- id:bean的唯一标识符,相当于对象名
class:bean对象对应的全限定名:包名+类型
name:别名,可以取多个
-->
<bean id="user" class="com.chen.pojo.User" name="a1 a2,a3;a4">
<constructor-arg name="name" value="xing"/>
<property name="name" value="chen"/>
</bean>
5.3:import
一般用于团队合作,可以将多个配置文件导入合并为一个
6:DI依赖注入
6.1构造器注入
6.2:set方式注入【重点】
- 依赖注入:set注入
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象的属性,有容器来注入
【环境搭建】
-
复杂类型
public class Address { private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Address{" + "address='" + address + '\'' + '}'; } }
-
真实测试对象
public class Student { private String name; private Address address; private String[] book; private List<String> hobby; private Map<String,String> card; private Set<String> game; private String wife; private Properties info; }
-
bean.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="student" class="com.chen.pojo.Student"> <property name="name" value="陈宇星"/> </bean> </beans>
-
测试类
6.3:拓展方式注入
我们可以使用p命令空间和c命令空间注入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- p命名空间,可以直接注入属性的值:properties-->
<bean id="user" class="com.chen.pojo.User" p:name="陈宇星" p:age="21"/>
<!-- c命名空间,通过构造器注入:construct-args-->
<bean id="user2" class="com.chen.pojo.User" c:age="18" c:name="小城"/>
</beans>
注意点:p命名和c命名空间不能直接使用,需要导入xml约束
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
6.4:bean的作用域
- 单例模式(spring默认模式)
-
原型模式:每次从容器中get的时候,都会产生一个新的对象
<bean id="user2" class="com.chen.pojo.User" c:age="18" c:name="小城" scope="prototype"/>
7:bean的自动装配
- 自动装配是spring满足bean依赖的一种方式
- spring会在上下文中自动寻找,并自动给bean装配属性
在spring中有三种装配方式
- 在xml中显示配置
- 在java中显示配置
- 隐式的自动装配bean
7.1:测试
- 搭建环境
- 一个人有两个宠物
7.2:自动装配
byname、bytype自动装配:
<bean id="cat" class="com.chen.pojo.Cat"/>
<bean id="dog" class="com.chen.pojo.Dog"/>
<!--
byName:会在容器中自动查找和自己对象set方法后面的值对应的beanid!
byType:会在容器中自动查找和自己属性类型相同的bean!
-->
<bean id="people" class="com.chen.pojo.Person" autowire="byType">
<property name="name" value="陈宇星"/>
</bean>
小结:
- byname:需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法值一致
- bytype:需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致!
7.4:使用注解实现自动装配
jdk1.5支持的注解,spring2.5就支持注解
The introduction of annotation-based configuration raised the question of whether this approach is “better” than XML.
要是用注解须知:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
@Autowired
直接在属性上使用即可!也可以在set方式上使用!
使用autowired我们可以不用编写set方法,前提是你这个自动装配的属性在IOC(spring)容器中存在,且符合名字byname!
科普:
@Nullable 字段标记了这个注解,说明这个字段可以为null
public @interface Autowired {
boolean required() default true;
}
如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解@Autowired完成时,我们可以使用@Qualifier(value = “xxx”)去配置@Autowired的使用
@Autowired
@Qualifier(value = "dog1")
private Dog dog;
@Resource注解
小结:
@Resource与@Autowired的区别:
- 都是用来自动装配的,都可以放在属性字段上
- @Autowired通过byType的方式实现,而且必须要求这个对象存在!
- @Resource默认通过byname的方式实现,如果找不到名字,则通过byType实现,如果两个都找不到的情况下,就报错!【常用】
- 执行顺序不同
8:使用注解开发
在spring4之后要是用注解开发必须保证aop的包导入了
使用注解需要导入context约束,增加注解的支持
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
-
bean
-
属性如何注入
@Component public class User { public String name; //@Value("chenyuxing")《==》<property name="name" value="chenyuxing"/> @Value("chenyuxing") public void setName(String name) { this.name = name; } }
-
衍生的注解
@Component有几个衍生注解,我们在web开发中,会按照mvc三层架构分层!
-
dao——【@Repository】
-
service——【@Service】
-
controller——【@Controller】
这四个注解功能都是一样的,都是代表将某个类注册到spring中,装配Bean
-
-
自动装配置
@Autowired:自动装配通过类型、名字 如果Autowired不能唯一自动装配,则需要通过@Qualifier(value=“xxx”) @nullable 标记字段可以为null @Resource 自动装配通过名字、类型
-
作用域
@Scope("singleton")
-
小结
xml与注解:
- xml更万能,适用于任何场合
- 注解不是自己类使用不了,维护相对复杂、
最佳实践:
-
xml用来管理bean
-
注解只负责完成属性注入
-
使用过程中,只需要注意一个问题:必须让注解生效,就必须注解的支持
<!-- 指定要扫描的包,这个包下面的注解就会生效--> <context:component-scan base-package="com.chen"/> <context:annotation-config/>
9:使用java的方式配置spring
我们现在要完全不适用spring的xml配置,全权交给java
javaConfig是spring的一个子项目,在spring4之后它成为了一个核心功能
10:代理模式
为什么要学习代理模式?因为这就是spring aop的底层【springaop、springmvc】
代理模式分类:
- 静态代理
- 动态代理
10.1:静态代理
角色分析:
- 抽象角色:一般会使用接口或者抽象类来解决
- 真实角色:被代理的角色
- 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作
- 客户:代理访问对象
代码步骤
- 接口
- 真实角色
- 代理角色
- 客户端访问代理
代理模式的好处:
- 可以使真实角色的操作更加纯粹
- 公共部分交给代理角色,实现业务分工
- 公共业务发生扩展,方便集中管理
缺点:
- 一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率低
10.2:加深理解
10.3:动态代理
角色分析:
- 抽象角色:一般会使用接口或者抽象类来解决
- 真实角色:被代理的角色
- 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作
- 客户:代理访问对象
11:AOP
11.2:使用spring实现aop
AOP:通过预编译或者运行期间动态代理的实现程序功能的统一维护的的一种技术。
method1:使用spring的api接口。 【主要是springapi接口实现】
method2:使用自定义类来实现aop【主要是切面】
method3:注解实现
12:整合mybatis
步骤:
- 导入相关jar包
- junit
- mybatis
- mysql数据库
- spring相关
- aop织入
- mybatis-spring【new】
- 编写配置文件
- 测试
12.1:回忆mybatis
- 编写实体类
- 编写核心配置文件
- 编写接口
- 编写mapper.xml
- 测试
12.2:mybatis-spring
- 编写数据源
- sqlSessionFactory
- sqlSessionTemplate
- 需要给接口加实现类
- 将自己写的实现类注入到spring中测试使用
13:声明式事务
13.1:回顾事务
- 要么成功,要么都失败
- 事务在项目开发中十分重要,涉及到数据的一致性问题
- 确保完整性和一致性
事务的ACID原则:
- 原子性
- 一致性
- 隔离性
- 多个业务可能操作同一个资源,防止数据损坏
- 持久性
- 事务一旦提交,无论系统发生什么问题,结果都不会发生变化
13.2:spring中的事务管理
- 声明式事务:AOP
- 编号式事务:需要在代码中,进行事务的管理
思考:
为什么需要事务?
-
如果不配置事务,可能存在数据提交不一致的情况
- mysql数据库
- spring相关
- aop织入
- mybatis-spring【new】
- 编写配置文件
- 测试
12.1:回忆mybatis
- 编写实体类
- 编写核心配置文件
- 编写接口
- 编写mapper.xml
- 测试
12.2:mybatis-spring
- 编写数据源
- sqlSessionFactory
- sqlSessionTemplate
- 需要给接口加实现类
- 将自己写的实现类注入到spring中测试使用
13:声明式事务
13.1:回顾事务
- 要么成功,要么都失败
- 事务在项目开发中十分重要,涉及到数据的一致性问题
- 确保完整性和一致性
事务的ACID原则:
- 原子性
- 一致性
- 隔离性
- 多个业务可能操作同一个资源,防止数据损坏
- 持久性
- 事务一旦提交,无论系统发生什么问题,结果都不会发生变化
13.2:spring中的事务管理
- 声明式事务:AOP
- 编号式事务:需要在代码中,进行事务的管理
思考:
为什么需要事务?
- 如果不配置事务,可能存在数据提交不一致的情况
- 如果我们不在spring中去配置声明式事务,我们就需要在代码中手动配置事务!