Spring
Spring Framework
Spring 的一个最大的目的就是使Java EE开发的更加容易。
Spring提供了更完善开发环境的一个框架。
组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用。再Spring中可以使用XML和Java注解组合这些对象。
一站式:在IOC和AOP的基础上可以整合各种开源框架和第三方库。【是继善Spring自身也提供了表现层SpringMVC和持久层Spring JDBC】
Spring核心
IOC【控制反转】
IoC 容器管理的是SpringBean,Spring里面的bean就类似于定义了一个组件,而这个组件的作用就是实现某个功能的。
Ioc不是什么技术而是一种设计思想。在Java开发中意味着将你设计好的都西昂交给容器控制,而不是传统的在对象内部直接控制。
Ioc容器控制对象
反转:又容器帮忙创建及注入依赖对象
Ioc是通过依赖注入实现的。
IOC配置的三种方式
- XML配置
- Java配置 @Configuration、@Bean
- 注解配置 Spring会自动扫描带有@Component,@Controller,@Service,@Repository这四个注解的类,然后帮我们创建并管理,前提是需要先配置Spring的注解扫描器。
@ComponentScan
依赖注入的三种方式
1. 构造方法注入
2. setter注入
3. 基于注解的注入【接口注入】
@Autowired ->[属性:Constructor,byType,byName]
推荐构造方法注入:因为该方法能够保证注入的组件不可变,并且确保需要的依赖不为空,并且能够保证完全初始化状态。
AOP【面向切面编程】
AOP的本质是为了解耦,她也是一种设计思想。Spring奖AOP的思想引入框架之中,通过预编译方式和运行期间动态代理实现程序的统一维护的一种技术。
AOP术语
-
连接点:在哪里干
-
切入点:在哪里干的集合
-
通知:干什么【前置通知、后置通知、异常通知、最终通知、环绕通知】
-
切面:在哪干和干什么集合
-
引入:引入什么
-
目标对象:对谁干
-
织入:怎么实现【动态织入、静态织入】
动态织入:在运行时将要增强的代码植入到目标类中【实现技术:动态代理——JDK Proxy、CGlib】
静态织入:编译时期织入。【ApectJ】 -
AOP代理:实现的一种典型方式
JDK Proxy CGlib 引入 JDK提供的工具类Proxy实现的,在运行时生成指定接口的代理类,实现需要代理的接口都有一个关联的调用处理程序对象,此对象实现了InvocationHandler,最终的业务逻辑实在InvocationHandler实现类的invoke方法上。 CGlib是一个强大的、高性能的代码生成包,它广泛被去多AOP框架使用,为他们提供方法的拦截 案例 不需要任何依赖。 需要引入pom包依赖 流程 1、ProxyGenerator创建Proxy的具体类;2、由static初始化块初始化接口方法;3、由构造函数注入InvocationHandler;4、执行的时候,通过ProxyGenerator创建的Proxy,调用InvocationHandler的invoke方法,执行我们自定义的invoke方法
|
Spring三级缓存解决循环依赖 **
当我们调用getBean()方法的时候,Spring会从一级缓存中去寻找目标Bean,如果发现一级缓存中没有便会去二级缓存中去找,如果还没有找到,则意味着该目标Bean还没有实例化,于是,Spring容器会实例化目标Bean。然后,将目标Bean放入到二级缓存中,同时,加上标记是否存在缓存依赖。如果不存在缓存依赖便会将目标Bean放入到二级缓存,否则,便会标记该Bean存在缓存依赖,然后等待下一次轮询复制,也就是解析@Autowired注解,等注解赋值完成后,会将目标Bean存入到一级缓存。
Spring一级缓存中存放所有的成熟Bean,二级缓存中存放所有的早期Bean,三级缓存中存放代理的Bean,先去一级缓存,再取二级缓存。
核心容器
Beans模块【spring-beans】
Core核心模块[spring-core]
Context上下文模块
SpEL模块
数据访问
JDBC
Transactions事务
Web模块
Web
Servlet
WebSocket
…
测试模块
Junit、TestNG