Spring IOC AOP以及Bean的底层解析理解
IOC的底层原理、创建对象与注入方式
IOC容器
- IOC即是控制反转,把对象创建的过程与对象的调用过程交给Spring容器来进行管理
- 使用了工厂模式,耦合度比较低
IOC底层原理
IOC的三个主要组成部分:XML解析、工厂模式、反射
先从最原始的编程方式来介绍:
一个类去实例化另外一个类,要是碰到实例多个类,耦合度比较高。这个时候!!可以用一下工厂模式来减低耦合度
通过中间的一个工厂类,我们在多个类调用时,只需要实例一个工厂类就可以,减低了代码间的耦合度。!!但是,我们可以通过IOC容器,通过xml配置文件和反射+工厂模式 来处理
以这种形式将耦合度降低到最低限度,这也是IOC的底层原理XML配置!!Java反射!工厂模式
IOC(BeanFactory)
- IOC思想基于IOC容器,IOC容器就是上面的对象工厂
- IOC容器的俩种实现方式(俩个接口)
- BeanFactory:IOC容器的基本实现,是Spring使用的内部接口,不建议开发人员使用,在读取配置文件时,加载配置文件并没有创建对象,而是等获取对象的时候再去创建
- ApplicatonContext:BeanFactory的子接口,有着更强大更完善的功能,供开发人员使用与BeanFactory不同,加载配置文件就将所有的对象创建完毕
在实际开发中我们应该选择ApplicationContext,将所有的对象在服务器启动时创建完成,可以减少运行时间
DI的注入方式
先定义一个User类
1 | public class User { |
①使用set方法,设值注入
1 | <!-- 配置User对象创建 --> |
注意,实体类中必须有set方法才可以使用这种注入
②构造注入
1 | <!-- 配置Book对象创建 --> |
③注解注入
先在XML配置中导入
1 | <context:annotation-config></context:annotation-config> |
注解的属性有:
@Component
@Service
@Controller
@Repository
以上是属于放在方法头部的注解
根据属性注入
- @Autowired:根据属性类型进行自动装配
- @Qualifier:根据名称进行注入,要和@Autowired 一起使用。会出现一个接口有多个实现类或一个类有多个子类,此时就需要使用@Qualifier指明注入的是哪一个
- @Resource:可以根据类型注入也可根据名称注入。当不指定name时根据类型注入,指定name时根据名称注入。
- @Value:注入普通类型属性
1 |
|
Bean的作用域
bean的作用域强行背了那么久,总算看到了人话说的理解方式了
bean的作用域是指在spring中设置Bean实例是单实例还是多实例,默认是单实例
简而言之:用单例的话,对象都是同一个地址,用了prototype去实例化,就是分配不同地址
①singleton(单例)–默认
1 | <bean id="myBean" class="com.yellowstar.pojo.MyBean" scope="singleton"></bean> |
②prototype(原型–多实例)
1 | <bean id="myBean" class="com.yellowstar.pojo.MyBean" scope="prototype"></bean> |
测试一下
1 |
|
以下③~⑤使用在Java Web
③session
④request
⑤globalSession
Bean的生命周期(最复杂)
我自己总结的大致流程
这里难以解释清楚,我推荐去查看这篇博文,讲解清楚得我怀疑人生
文章结合本人理解以及CSDN博文,点击查看->,梳理了下大致的理解
Spring AOP
什么是AOP
aop 即面向切面编程,在不改源码的情况下,通过切面对业务逻辑进行增强,降低代码的耦合性
AOP的底层是如何实现的
①有接口的情况,JDK动态代理
创建接口实现类的代理对象,增强类的方法
②没有接口的情况,使用CGlib动态代理
创建子类的代理对象,增强类中的方法
Spring的事务管理的实现机制
事务管理是什么
事务这个概念是数据库层面的,Spring只是基于数据库中的事务进行了扩展,以及提供了一些让程序员能够更加方便操作的方式
事务管理分为:
- 编程式事务管理
- 声明式事务管理(常用)
①使用Spring AOP XML 方式 (<基于 tx / AOP 配置的声明式事务管理方式) 进行配置
1 | <!-- 5.配置transactionManager事务管理器:依赖于dataSource数据源 --> |
②使用Spring AOP Annotation 方式 (即使用@Transactional注解实现声明式事务管理)
1 | <!-- 5.配置transactionManager事务管理器:依赖于dataSource数据源 --> |
Java实现:
1 |
|
事务的传播级别
有七种事务传播行为,默认为REQUIRED
- REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务,则是常见的选择
- SUPPORTS:支持当前事务,如果当前没有事务,就以非实物方式执行
- MANDATORY:支持当前事务,如果当前没有事务,就抛出异常
- REQUIRED_NEW:新建事务,如果当前存在事务,把当前事务挂起
- NO_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
- NEVER:以非事务方式执行,如果当前存在事务,则抛出异常
- NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务