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