一,spring框架概述
1、spring框架是轻量级的开源JavaEE框架
2、spring可以解决企业应用开发的复杂性
3、spring有两个核心部分:IOC和AOP
IOC:控制反转,把创建对象过程交给Spring来进行管理
AOP:面向切面,不修改源代码进行功能增强
4,spring的特点
1,方便解耦,简化开发
2,AOP的编程支持
3,方便程序测试
4,方便与其他框架进行整合
5,方便进行事务的操作
6,降低API开发难度
1.1 简介
spring理念:使现有的技术更容易使用,本身是一个大杂烩,整合了现有的技术框架
spring是一个开源的免费的框架!(容器)
spring是一个轻量级,非入侵式的框架!
控制反转(IOC) ,面向切面编程的(AOP)
支持事务的处理,对框架整合的支持!
总结:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!


其中提到的springboot是一个快速开发的脚手架。
基于SpringBoot可以快速的开发单个微服务。
约定大于配置
SpringCloud
SpringCloud是基于SpringBoot实现的。
现在大多数公司都在使用SpringBoot进行快速的开发,学习SpringBoot 的前提,需要完全掌握Spring以及SpringMVC 起到承上启下的作用!
1.2,环境配置
版本问题

新建一个maven项目,不要勾选默认的模板

检查这两个配置文件,用自己的maven,不要用idea自带的。用自己配置的阿里云镜像,下载依赖比较快

然后把父工程的src目录给删除掉

2,用maven导入spring的依赖
网址:maven仓库导入spring依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.15</version>
</dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.15</version>
</dependency>
二,IOC(依赖注入)
什么是IOC:
控制反转IOC,是一种设计思想,DI(依赖注入)是实现Ioc 的一种方法,个人认为所谓控制反转就是:获得依赖对象的方式反转了。采用xml方法配置bean的时候,Bean的定义信息是和实现分离的,而采用注解的方法可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到零配置的目的。
=======================================
IOC的思想基于IOC容器完成, IOC容器底层就是对象工厂
spring提供了IOC容器实现的两种方式:(两个接口)
(1)BeanFactory:IOC容器基本实现,是spring内部的使用接口,不提供开发人员进行使用
加载配置文件时候不会创建对象,在获取对象(使用)才会去创建对象
(2)ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用
加载配置文件时候就会把在配置文件对象进行创建
=========================================
IOC底层原理:xml解析,工厂模式,反射
使用set注入之后,程序不在具有主动性,而是变成了被动的接受对象。
//用户实际调用的是业务层,dao层不需要接触UserServiceImpl userService = new UserServiceImpl();((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl());userService.getUser();
这种思想,从本质上解决了问题,我们程序员不用在去管理对象的创建了。系统的耦合行大大降低了,可以更加专注的在业务的实现上,这就是ioc的原型。
ssm有一个弊端
每一个层都要写一个配置文件,然后在整合到application.properties文件里,配置太多了,人称配置地狱,直到springboot的出现!!
三,IOC操作Bean管理
1,什么是bean管理
bean管理指的是两个操作
spring创建对象
spring注入属性
2、bean管理操作有两种方式
(1)基于xml配置文件的方式实现
(2) 基于注解的方式实现(推荐使用)
配置User对象
<bean id="user" class="cn.skyang.USer"></bean>
(1) 在spring配置文件当中,使用bean标签,标签里面添加对应的属性,就可以实现对象创建
(2) 在bean标签有很多属性,介绍常用的属性
(3) id class:注意最好使用全类路径 创建对象的时候默认执行无参构造方法进行对象的创建
2.1、基于xml方式注入属性
(1)DI:依赖注入,就是注入属性的意思
使用set的方法注入或者使用有参构造的方法注入
3.1 注入属性 外部bean

3.1 注入属性 内部bean
级联赋值的概念:一个属性出现多个表中,修改一个表当中的该属性,为了保持数据同步该属性在另外的表中也会被修改
1、一对多的关系:部门和员工
一个部门有多个员工,一个员工属于一个部门
2、在实体类之间表示一对多关系,员工表示所属的部门,使用对象类型属性进行表示。

3.3 注入集合属性xml
IOC操作bean的管理(xml注入集合的属性)
1.、注入数据类型属性
2、注入List集合类型属性
3、注入Map集合类型的属性

FactoryBean
1、spring有两种类型的bean,一种是普通bean,另一种是工厂bean(FactoryBean)
2、普通bean:在配置文件当中定义bean的类型就是返回值类型
3、工厂bean:在配置文件当中bean的类型可以和返回值类型不一样。
步骤1:创建类:让这个类作为工厂bean,实现接口FactoryBean
步骤2:实现接口的方法,在实现方法中定义返回的bean类型

3.4 bean的作用域
在spring里边,设置创建bean的实例是单例还是多例?
默认是单例

3.5 bean的生命周期
从对象创建到对象销毁的过程
通过构造器创建bean实例(无参数构造)
为bean的属性设置值和对其他bean的引用(调用set方法)
调用bean的初始化的方法(需要进行配置初始化的方法)
bean可以使用了(对象获取到了)
当容器关闭的时候,调用bean的销毁的方法(需要配
3.6 Bean引入外部属性文件
1,直接配置数据库信息
2,配置德鲁伊连接池
3,引入外部属性文件配置数据库连接
小结:

四、 IOC Bean(基于注解的方式)
1,什么是注解
注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值…)
使用注解,注解作用在类上面,方法上面,属性上面,使用注解的目的,简化xml的配置
2,Spring针对Bean管理中创建对象提供注解
@Component
@Service
@Controller
@Repository
上面四个注解功能是一样的,都可以用来创建bean实例
今天在写程序的时候看见一个以前没有见过的注解(@Component),在网上查找过后,经过实践,决定把它记录下来。
1、@controller 控制器(注入服务) Controller层
用于标注控制层,相当于struts中的action层
2、@service 服务(注入dao) service层
用于标注服务层,主要用来进行业务的逻辑处理
3、@repository(实现dao访问)dao层
用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.
4、@component 实体类(把普通pojo实例化到spring容器中,相当于配置文件中的)泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。
5、@Mapper
这个注解表示这个是一个mybatis的mapper类,dao 层
6、@Repository
@Repository注解修饰哪个类,则表明这个类具有对对象进行CRUD(增删改查)的功能,而且@Repository是@Component注解的一个派生品,所以被@Repository注解的类可以自动的被@ComponentScan 通过路径扫描给找到。(这也在一定程度上解释了,为什么被@Repository注解的类也能@Autowired)
组件扫描配置


4.1 注入属性:@Autowire and @Qualifler
@Autowired:根据属性类型进行自动装配
第一步把service和dao对象创建,在service和dao类添加创建对象注解
第二步在service注入dao对象,在service类添加dao类型属性,在属性上面使用注解
@Serivcepublic class UserService {@Autowiredprivate UserDao userDao;public void add() {System.out.println("service add......");userDao.add();}}
@Qualifier:根据名称进行注入
这个@Qualifier注解的使用,和上面@Autowired一起使用
//添加注入属性注解
@Autowired //根据类型进行注入
@Qualifiter(value = "userDaoImpl") //根据名称进行注入
private UserDao userDao
@Resources:可以根据类型注入,也可以根据名称进行注入
@Resource(name = "userDaoImpl") //根据名称进行注入
private UserDao userdao;
@Value:注入普通类型的属性
@Value(value = "abc")
private String username
4.2 完全注解开发
把配置文件的内容放到注解当中,省略bean当中的配置
开始接触Springboot ioc基本结束

五 AOP
5.1 基本概念
1,面向切面编程(方面) ,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务各部分之间的耦合度降低,提高程序的可重用性,同时提高开发的效率
通俗的描述就是:不通过修改源代码的方式,在主干功能里面添加新功能。
使用登录的例子说明AOP 相当于直接添加一个插件来实现某一个方面的功能。

5.2 AOP的底层原理
1,AOP底层使用动态代理
有两种情况动态代理
一,有接口的情况 使用JDK动态代理
创建接口实现类代理对象,增强类的方法

二。无接口的情况,使用CGLOB动态代理
创建子类的代理对象,增强类的方法

5.3 动态代理
代理模式的好处:
- 可以使真实的角色的操作更加纯粹!不用去关注一些公共的业务
- 公共也就是交给代理角色,实现业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
动态代理的 需要了解两个类:Proxy:代理,InvocationHabdler:调用处理程序
动态代理的好处:
可以使真实的角色的操作更加纯粹!不用去关注一些公共的业务,
公共也就交给代理角色!实现了业务的分工,
公共业务放生扩展的时候,方便集中管理!
一个动态代理类代理的是一个接口,一遍就是对应一类业务
一个动态代理类可以代理多个类,只要是实现了同一个接口即可!
5.4 AOP在spring当中的作用
提供声明式事务,允许用户自定义切面
横切关注点:跨越应用程序的方法和功能,与我们的逻辑业务没有关系,但是我们需要关注的部分,就是横切关注点,如:日志,安全,缓存,事务等等。。
方式一:使用spring的API接口,【主要是springAPI接口的实现】
方式二:自定义来实现AOP【主要是切面定义】
总结:为了实现不用修改源代码,用AOP的方式去实现增加新的一个切面,新增加一个业务,用注解的方式感觉实现起来的语法有点奇怪。
6、spring事务的操作
1,回顾事务
把一组业务当做一个业务来做;要么都成功,要么都失败
事务在项目开发中,十分的重要,涉及到数据的一致性问题,不能马虎
要确保完整性和一致性;
事务的ACID原则:
原子性 一致性
隔离性:多个业务可能操作同一个资源,防止数据损坏
持久性:事务一旦提交,无论系统发生什么问题,结果都不会再被受到影响,被持久化的写到存储器当中!
2,声明式事务
<tx:advice id="txAdvice" transaction-manager="transactionManager"><!--给哪些方法配置事务配置事务的传播特性 new propagation--><tx:attributes><tx:method name="add" propagation="REQUIRED"/><tx:method name="delete" propagation="REQUIRED"/><tx:method name="update" propagation="REQUIRED"/><tx:method name="query" read-only="true"/><tx:method name="*" propagation="REQUIRED"/></tx:attributes></tx:advice><aop:config><aop:pointcut id="txPointCut" expression="execution(* cn.skyang.mapper.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/></aop:config>
spring中的事务管理
声明式事务:AOP
编程式事务:需要在代码中,进行事务的管理
思考:
为什么需要事务?
如果不配置事务,可能存在数据提交不一致的情况
如果我们不在Spring中去配置声明式事务,我们就需要在代码中手动去配置事务!
事务在项目的开发中十分重要,涉及到数据的一致性和完整性,不容马虎!!
六,整合mybatis
1,编写数据源配置
2,sqlSessionFactory
3,sqlSessionTemplate
写在spring-dao.xml中
<!-- DataSource:使用Spring的数据源代替mybatis的配置:c3p0 dbcp druid我们这里使用的Spring提供的JDBC:org.springframework.jdbc.datasource--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="196235qaz"/></bean><!--配置SessionFactory--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><!--绑定mybatis配置文件--><property name="configLocation" value="classpath:mybatis-config.xml"/><property name="mapperLocations" value="classpath:cn/skyang/mapper/*.xml"/></bean><!--SqlSessionTemplate就是我们使用的sqlSesson--><bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"><!--只能使用构造器注入sqlSessionFactory,因为它没有set方法--><constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg></bean>

4,需要给接口加实现类【】
5,将自己写发实现类,注入到Spring中
写在applicationContext.xml<import resource="spring-dao.xml"/><bean id="UserMapper" class="cn.skyang.mapper.UserMapperImpl"><property name="sqlSession" ref="sqlSession"/></bean><bean id="UserMapper2" class="cn.skyang.mapper.UserMapperImpl2"></bean>
6,测试使用即可
















