Spring(已完结)
2019-08-08 17:40:33 7 举报
AI智能生成
Spring知识点
作者其他创作
大纲/内容
SpringIOC基础
概念
IOC
DI
内部对象的创建
使用类构造器实例化(默认无参)<br>
使用静态工厂方法实例化
初始化bean的 时机<br>
Bean的作用域
singleton(默认)
prototype
request
session
指定bean的初始化方法和销毁方法<br>
依赖注入DI
通过构造器注入 <br>
使用属性setting方法 进行注入<br>
装配 list集合<br>
装配set集合
装配map
装配properties<br>
注解注入
@Auowired<br>
@Qualifier
@Resource
@PostConstruct
@preDestory
@Scope
<span> @Value</span>
@Configuration
@Configuation加载配置spring并启动spring容器<br>
@Configuration启动容器+@Bean注册Bean,@Bean下管理bean的生命周期
@Configuration启动容器+@Component注册Bean
@Configuration总结
@Configuration等价于<beans></beans>
@Bean等价于<bean></bean>
@CompnentScan等价于<context:component-scan base-package=""/><br>
组合多个配置类
在@configuration中引入spring的xml配置文件
在@configuration中引入其它注解配置<br>
@Profile
扫描注入<br>
@Service
标注业务层组件
@Controller
用于标注控制层组件
@Repository
用于标注数据访问组件,即DAO组件
@Component
泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注<br>
启动spring
Spring jdbc<br>
Spring 不同的ORM持久化技术<br>
Spring cache<br>
缓存命中率<br>
命中率
从缓存中读取次数 / (总读取次数[从缓存中读取次数 + 从慢速设备上读取的次数])
Miss率
没有从缓存中读取的次数 / (总读取次数[从缓存中读取次数 + 从慢速设备上读取的次数])
缓存策略
移除策略
FIFO(First In First Out)
LRU(Least Recently Used)
LFU(Least Frequently Used)
TTL(Time to Live)<br>
TTI(Time To Idle)<br>
Cache接口
ConcurrentMapCache
GuavaCache
EhcacheCache
依赖包<br>
示例<br>
基于注解的配置<br>
JCacheCache
缓存注解
<span>@Cacheable</span>
<span>@CacheEvic</span>
<span>@CachePut</span>
@Caching
自定义注解<br>
缓存注解开启开关<br>
键生成策略
如果方法没有参数,则使用0作为key
如果只有一个参数的 话则使用该参数作为key<br>
如果参数多余一个的话则使用所有参数的hashCode作为key<br>
自定义键生成策略
configuration:定义缓存位置和具体保存策略
继承<span><span>AbstractRoutingDataSource 实现数据源切换<br></span></span>
配置文件用户名密码加解密:<u><b>继承PropertyPlaceholderConfigurer</b></u>
spring事件驱动
事件模型的应用<br>
观察者模式<br>
JDK中的观察者模式<br>
spring事件驱动
创建传输载体<br>
定义支付状态更新的事件<br>
定义事件监听器<br>
spring配置文件
测试类<br>
全局异步执行
XML配置
注解配置
spring内置的事件
ContextRefreshedEvent
ContextClosedEvent <br>
ContextStartedEvent
ContextStoppedEvent
RequestHandleEvent <br>
ContextRefreshedEvent
mock测试
spring线程池<br>
基本组成
CORE
spring-core
spring-beans
spring-context:在spring-core的基础上提供bean的访问方式
AOP
spring-aop:提供了面向切面编程,允许定义方法拦截器和切入点。
spring-aspects:提供与AspectJ的集成
Instrumentation:提供对javaagent的支持和类加载器
Instrumentation-tomcat:专门针对tomcat 进行类转换与加载管理
<p>Data Access<code></code></p>
spring-jdbc:提供了JDBC的抽象层
spring-tx:提供了类的编程和声明式事务管理
spring-orm
spring-jms:java 消息服务,包含用于生成和消费消息
web
spring-web:
spring-webmvc:
AOP基础
概念<br>
相关术语
Target(目标类)
Proxy(代理)
Joinpoint(连接点)
Pointcut(切点)
Advice(增强)
Advised(切面)
Weaving(织入)
Introduction(引入)
增强类型<br>
Before Advice(前置增强)<br>
After Advice(后置增强)<br>
Around Advice(环绕增强)<br>
Throws Advice(抛出增强)<br>
Introducation Advice(引入增强)<br>
方案
写死代码
静态代理
动态代理
JDK动态代理
InvocationHandler
Proxy
实现步骤<br>
定义接口UserService<br>
定义接口实现类UserServiceImpl
实现自定义InvocationHandler<br>
编写测试类<br>
代理生成过程<br>
使用ProxyGenerator生成
使用JVM 启动参数
CGLib动态代理
<span style="font-family:Simsun;font-size:14px;">Enhancer</span>
setSuperclass:设置产生代理对象的父类
setCallback(Callback callback):设置callback接口的实例<br>
setCallbacks(Callback[] callbacks):设置多个CallBack接口的实例<br>
setCallbackFilter(callbackFilter filter):设置方法回调过滤器<br>
Object create():使用默认无参数的构造方法创建目标对象<br>
<span style="font-size:14px;"><span style="color:rgb(64,64,64);font-family:'Courier New';"><span style="background-color:inherit;"><span style="background-color:inherit;">MethodInterceptor</span></span></span></span>
MethodProxy
`CallbackFilterr`有选择的对一些方法使用回调。
Callback
FixedValue
为提高性能,FixedValue回调对强制某一特别方法返回固定值是有用的。
LazyLoader
当实际的对象需要延迟装载时,可以使用LazyLoader回调。一旦实际对象被装载,它将被每一个调用代理对象的方法使用。
Dispatcher
Dispathcer回调和LazyLoader回调有相同的特点,不同的是,当代理方法被调用时,装载对象的方法也总要被调用。
NoOP
回调把对方法调用直接委派到这个方法在父类中的实现
存在问题?
method.invoke 会出现无限循环调用<br>
<span style="font-family:SimSun;font-size:14px;"><span style="line-height:19.6px;">proxy.invokeSuper(</span></span><span style="font-family:SimSun;font-size:14px;"><span style="line-height:19.6px;"><span style="font-family:SimSun;font-size:14px;"><span style="line-height:19.6px;">退出当前interceptor的处理</span></span>,</span></span><span style="font-family:SimSun;font-size:14px;"><span style="line-height:19.6px;"><span style="font-family:SimSun;font-size:14px;"><span style="line-height:19.6px;">进入下一个callback处理</span></span>):调用原始类的被拦截的方法</span></span>
<span style="font-family:SimSun;font-size:14px;"><span style="line-height:19.6px;">proxy.invoke(</span></span><span style="font-family:SimSun;font-size:14px;"><span style="line-height:19.6px;"><span style="font-family:SimSun;font-size:14px;"><span style="line-height:19.6px;">则会继续回调该方法</span></span>)</span></span>
实现步骤<br>
创建代理类 <br>
常见增强代理类
测试
CGLIB包结构
core(底层字节码处理类)
transform(该包中的类用于class文件运行时转换或编译时转换)
proxy(该包中的类用于创建代理和方法拦截)
reflect(该包中的类用于快速反射
util(集合 排序弓工具类)<br>
beans(javaBean工具类0
Spring AOP<br>
编程式(基于AOP接口)<br>
前置增强
后置增强
环绕增强<br>
抛出 增强<br>
客户端调用<br>
声明式<br>
手工代理
自动代理
扫描Bean名称
扫描切面配置<br>
Spring + Aspect<br>
基于注解(基于@Aspect)+<span><span class="annotation">@Around+</span></span><span><span class="annotation">+</span></span><span><span class="string">execution</span></span>
基于注解(基于@Aspect)+<span><span class="annotation">@Around+</span></span><span><span class="string">@</span></span><span><span class="string">annotation</span></span>
基于配置(基于<aop:config><br>
注解说明
@Aspect:作用是把当前类标识为一个切面供容器读取
@Before:标识一个前置增强方法,相当于BeforeAdvice的功能
@AfterReturning:后置增强,相当于AfterReturningAdvice
@AfterThrowing:异常抛出增强,相当于ThrowsAdvice
@After:final增强,不管是抛出异常或者正常退出都会执行
@Around:环绕增强,相当于MethodInterceptor
@DeclareParents:引介增强,相当于IntroductionInterceptor
execution切点函数
<span style="font-size:14px;"><span style="font-size:18px;"><span style="color:rgb(204,0,0);"><strong>execution (* com.sample.service.impl..*.*(..))</strong></span></span></span>
<span style="font-size:14px;">execution(): 表达式主体。</span>
<span style="font-size:14px;">第一个*号:表示返回类型,*号表示所有的类型。</span>
<span style="font-size:14px;">包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法</span>
<span style="font-size:14px;">第二个*号:表示类名,*号表示所有的类。</span>
<span style="font-size:14px;">*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参</span>
事务管理<br>
事务ACID特性<br>
Atomicity(原子性)
Consistency(一致性)
Isolation(隔离性)
Duration(持久性)
由事务并发引起的问题
Dirty Read(脏读)-事务A读取了事务B未提交的数据,并在这个基础 上又做了其他操作
Unrepeatable Read(不可重复读)- 事务A读取了事务B已提交的数据
Phantom Read(幻读 )-事务A读取 了事务B已提交的新增数据
JDBC事务解决方案
READ_UNCOMMITTED
READ_COMMITTED<br>
REPEATABLE_READ
SERIALIZABLE
Spring解决方案
事务传播行为<br>
PROPAGATION-REQUIRED-如果没有,就新建一个事务:如果有,就加入当前事务。(默认)
PROPAGATION_REQUIRES_NEW-如果没有,就新建一个事务;如果有,就将当前事务挂起
PROPAGATION_NESTED-如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务
PROPAGATION_SUPPORTS-如果没有,就以非事务方式执行;如果有,就使用当前事务。
PROPAGATION_NOT_SUPPORTED-如果没有,就以非事务方式执行,如果有,就将当前事务挂起
PROPAGATION_NEVER-如果没有,就以非事务方式执行;如果有,就抛出异常。
PROPAGATION_MANDATORY-如果没有,就抛出异常;如果有,就使用当前事务
事务超时
只读事务
spring注解配置事务
spring配置文件使用
在需要事务的方法上使用<br>
@Transactional使用注意事项
<span style="font-family: 'comic sans ms', sans-serif;"><b>@Transactional</b> 只能被应用到public方法上, 对于其它非public的方法,如果标记了<b>@Transactional</b>也不会报错,但方法没有事务功能.</span><br>
<b>@Transactional</b>可以作用与接口、接口方法、类以及类方法上,但是<b>Spring</b>建议我们不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。
<span style="font-family: 'comic sans ms', sans-serif;"><strong>@Transactional注解中常用参数说明</strong></span>
<strong><span style="font-family: 'courier new', courier;">readOnly</span></strong>
<strong><span style="font-family: 'courier new', courier;">rollbackFor</span></strong>
<strong><span style="font-family: 'courier new', courier;">rollbackForClassName</span></strong>
<strong><span style="font-family: 'courier new', courier;">noRollbackFor</span></strong>
<strong><span style="font-family: 'courier new', courier;">noRollbackForClassName</span></strong>
<strong><span style="font-family: 'courier new', courier;">propagation</span></strong>
<strong><span style="font-family: 'courier new', courier;">isolation</span></strong>
<strong><span style="font-family: 'courier new', courier;">timeout</span></strong>
Spring 事务回滚规则 <br>
Mysql默认隔离级别
事务管理器(PlatformTransactionManager)<br>
DataSourceTransactionManager
HibernateTransactionManager
JpaTransactionManager
JtaTransactionManager
PersistenceBrokerTransactionManager
TransactionSynchronization 中获取对应线程绑定资源的工具类
DataSourceUtils
SessionFactoryUtils
EntityManagerFactoryUtils
PersistenceManagerFactoryUtils
XMl 形式配置<br>
mybatis
hibernate
注解形式配置
mybatis
hibernate
Spring IOC容器设计<br>
管理Bean
Bean的创建<br>
Bean的存储<br>
Bean的获取<br>
自动完成依赖的检测与注入(依赖注入)
自动生成Bean<br>
定义Bean
Bean的属性定义
name
id
scope(单例、多例)
className
parent
lazyInit
Depends
property
Bean定义存储
XML
properties
加载解析注册Bean<br>
加载XML文件流<br>
转换成Document
解析注册BeanDefinition<br>
解析<br>
注册
Spring AOP设计<br>
AOP定义
AdvisedSupport
AspectJProxyFactory
ProxyFactory
ProxyFactoryBean
通知或拦截
BeforeAdvice
AfterAdvice
MethodInterceptor
Invocation
CglibMethodInvocation
ReflectiveMethodInvocation
生成代理对象<br>
CglibAopProxy
JdkDynamicAopProxy
aop bean 工厂<br>
AopProxyFactory
底层实现<br>
java proxy<br>
Proxys
InvocationHandler
cglib proxy<br>
MethodInterceptor
Enhancer
Advised、Advice、Advisor的区别
Advised: 包含所有的Advisor和Advice<br>
Advice:通知拦截器
Advisor:通知+切入点的适配器
bean的生命周期
<span style="font-family: courier new, courier">Bean的建立, 由BeanFactory读取Bean定义文件,并生成各个实例</span>
<span style="font-family: courier new, courier">Setter注入,执行Bean的属性依赖注入</span>
<span style="font-family: courier new, courier">BeanNameAware的setBeanName(), 如果实现该接口,则执行其setBeanName方法</span>
<span style="font-family: courier new, courier">BeanFactoryAware的setBeanFactory(),如果实现该接口,则执行其setBeanFactory方法</span>
<span style="font-family: courier new, courier">BeanPostProcessor的processBeforeInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processBeforeInitialization()方法</span>
<span style="font-family: courier new, courier">InitializingBean的afterPropertiesSet(),如果实现了该接口,则执行其afterPropertiesSet()方法</span>
<span style="font-family: courier new, courier">Bean定义文件中定义init-method</span>
<span style="font-family: courier new, courier">BeanPostProcessors的processAfterInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processAfterInitialization()方法</span>
<span style="font-family: courier new, courier">DisposableBean的destroy(),在容器关闭时,如果Bean类实现了该接口,则执行它的destroy()方法</span>
<span style="font-family: courier new, courier">Bean定义文件中定义destroy-method,在容器关闭时,可以在Bean定义文件中使用“destory-method”定义的方法</span>
applicationContext生命周期
<span style="font-family: courier new, courier">实例化一个Bean,也就是我们通常说的new</span>
<span style="font-family: courier new, courier">按照Spring上下文对实例化的Bean进行配置,也就是IOC注入</span>
<span style="font-family: courier new, courier"> 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID</span>
<span style="font-family: courier new, courier">如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)</span>
<span style="font-family: courier new, courier">如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文,该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法</span>
<span style="font-family: courier new, courier">如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object<br> obj, String <br>s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术</span>
<span style="font-family: courier new, courier">如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法</span>
<span style="font-family: courier new, courier">如果这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法</span>
<span style="font-family: courier new, courier"> 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法</span>
<span style="font-family: courier new, courier">最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法</span>
spring测试
Spring test+Junit<br>
依赖jar包<br>
创建测试类<br>
<b>@RunWith</b>:用户指定junit环境
<b>@ContextConfiguration</b>:导入配置文件
<span style="margin:0px; padding:0px; font-size:18px">@Transactional</span>
Mock对象
JNDI测试支持
Web测试支持
工具类<br>
反射工具类
JDBC工具类
0 条评论
下一页