一、什么是Spring
1、管理Bean与Bean之间的关系
二、Spring环境搭建
1、依赖:spring-core,spring-context,spring-aop
2、配置文件
当xml中配置相同bean id时,启动报错
三、Spring作用域
singleton、prototype、request,session
四、SpringIOC
1、IOC:控制反转
将Bean交给Spring容器进行管理
2、DI:依赖注入
解决对象之间的依赖关系
2.1 set方法注入
bean中property标签,使用ref依赖对象关系
2.2 构造函数注入
2.3 注解
配置文件中添加组件扫描标签<context:component-scan base-package="package_path"></context:component-scan>
Autowired:默认使用byType进行装配,想使用名称匹配注入时配合Qualifier注解
Resource:使用名称匹配注入
3、容器创建对象方式
调用无参构造器---默认方式
调用带参构造器
工厂创建对象
五、SpringAOP
1、代理模式
提供对目标对象的一种访问方式
静态代理:需要生成代理类
动态代理:不需要生成代理类,JDK(反射机制)和CgLib(字节码)
2、基础
面向切面编程,权限控制、事务管理等。在不同的方法中,进行相同的操作。
关注点:即重复代码
切面:泛指交叉业务逻辑,即抽取的重复代码
切入点: 切面具体织入的位置,拦截的哪些方法
3、使用方式
注解:开启aop注解,<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
Xml方式:
4、AOP通知类型:
前置通知:目标方法之前执行 @Before
后置通知:目标方法之后执行,始终执行 @After
返回后通知:执行方法结束前执行,异常时不执行,后置通知后执行 @AfterReturning
异常通知:异常时通知 @AfterThrowing
全局捕获异常底层实现即使用AOP的异常通知
环绕通知:环绕目标方法执行,传入ProceedingJoinPoint参数,执行proceed方法,前段在前置通知后,后段在后置通知后,后段通知能被异常通知打断 @Around
如权限判断,当无权限时,不执行roceedingJoinPoint.proceed()方法

六、Spring事务
1、事务
保证数据的一致性
事务的特性:ACID-Atomicity,Consistency,Isolation,Durability(持久性)
2、Spring事务
2.1 分类
编程式事务:
声明式事务:@Transactional
3、编程式事务
3.1 获取数据源的api,通过api调用begin、commit、rollback
3.2 配置文件
<!-- 开启注解 -->
<context:component-scan base-package="com.dy.programmingtransaction"></context:component-scan>
<!-- 1. 数据源对象: C3P0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://192.168.236.128:3306/test"></property>
<property name="user" value="root"></property>
<property name="password" value="19919123"></property>
</bean>
<!-- 2. JdbcTemplate工具类实例 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务 -->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>\
3.3 编程式事务编写

4、声明式事务
使用AOP中的Around和AfterThrowing,捕获异常后回滚。
注意:业务处理层一般不是用try,便于捕获异常。一般在控制层捕获异常。
配置文件:开启注解事务<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
5、事务传播行为
5.1 事务传播行为
即事务的传递
5.2 事务传播行为分类
- PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
- PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。(如果当前有事物,我就用当前事物,如果当前没有事物,就以非事物进行执行)
- PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
- PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
- PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
七、源码查看
1、源码下载
1.1 git源码下载地址:https://github.com/spring-projects/spring-framework/tags?after=v4.0.3.RELEASE
1.2 maven下载源码:下载jar包目录下包含xx-sources.jar,可直接进入查看源码
对应jar包右键properties下:

1.3 Spring jar
spring-core:核心jar
spring-context:上下文,包含IOC具体实现
spring-jdbc:数据库
spring-aop:切面编程
1.4 快捷键
ctrl+t:查看包含什么子类
ctrl+o:查看该类下的方法
2、SpringIOC
2.1 BeanFactory----spring-beans
定义了SpringIOC的基本形式。
2.2 BeanDefinition----spring-beans
xml解析
2.3 IOC源码路径(ClassPathXmlApplicationContext)
父类:AbstractRefreshableApplicationContext,执行refreshBeanFactory方法,一步步进行解析xml文件,注册bean到IOC容器
八、Spring Bean生命周期
1、生命周期
1.Spring对Bean进行实例化(相当于程序中的new Xx())
2.Spring将值和Bean的引用注入进Bean对应的属性中
3.如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法
(实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有用到Bean的ID的)
4.如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanDactory(BeanFactory bf)方法并把BeanFactory容器实例作为参数传入。
(实现BeanFactoryAware
主要目的是为了获取Spring容器,如Bean通过Spring容器发布事件等)
5.如果Bean实现了ApplicationContextAware接口,Spring容器将调用setApplicationContext()方法,把bean所在的应用上下文的引用传入.
(作用与BeanFactory类似都是为了获取Spring容器,不同的是Spring容器在调用setApplicationContext方法时会把它自己作为setApplicationContext
的参数传入,而Spring容器在调用setBeanDactory前需要
程序员自己指定(注入)setBeanDactory里的参数BeanFactory )
6.如果Bean实现了BeanPostProcess接口,Spring将调用它们的postProcessBeforeInitialization(预初始化)方法
(作用是在Bean实例创建成功后对进行增强处理,如对Bean进行修改,增加某个功能)
7.如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet方法,作用与在配置文件中对Bean使用init-method声明初始化的作用一样,都是在Bean的全部属性设置成功后执行的初始化
方法。
8.如果Bean实现了BeanPostProcess接口,Spring将调用它们的postProcessAfterInitialization(后初始化)方法(作用与6的一样,只不过6是在Bean初始化前执行的,而这个是在Bean初始化后执行的,
时机不同 )
9.此时,bean已经准备就绪,可以被程序使用了,Bean将一直驻留在应用上下文中给应用使用,直到应用上下文被销毁
10.如果Bean实现了DispostbleBean接口,Spring将调用它的destory方法,作用与在配置文件中对Bean使用destory-method属性的作用一样,都是在Bean实例销毁前执行的方法。

九、SpringAOP
spring容器启动,每个bean的创建都会先经过AbstractAutoProxyCreator类的postProcessAfterInitialization方法
十、Spring MVC流程
1、Spring MVC核心技术
servlet进行包装
2、流程:
请求交给DispatcherServlet进行管理
执行DispatcherServlet中的doService方法,统一调用doDispatch方法执行请求
根据HandlerMapping,获取Handler
获取HandlerAdapter,可执行拦截器,调用Handler处理具体请求,返回ModelAndView
视图解析ViewResolver

浙公网安备 33010602011771号