一 IOC容器概述
ioc类型:构造注入 属性注入 接口注入
类装载步骤:装载 验证 准备 解析 初始化 使用 卸载
classLoader:根加载器(bootstrap) 扩展加载器(ext) 系统加载器(app) 采用全盘负责委托机制
反射:可以从class对象获取构造函数 成员变量 方法三个主要反射类
资源访问利器Resource:FileSystemResource ClassPathResource ServletContextResource
BeanFactory ApplicationContext:beanFactory为ioc容器 spring框架的基础设施 面向spring,常用XmlBeanFactory ,applicationContext为应用上下文,面向开发者,主要实现类有classpathXmlApplicationContext fileSystemXmlApplicationContext,区别:beanFactory 在第一次调用才初始化,而applicationContext是在容器启动初始化上下文即初始化bean
WebapplicationContext:两种初始化方法 org.springframework.web.context.ContextLoaderListener和org.springframework.web.context.ContextLoaderServlet
Bean生命周期:获取bean 初始化 设置属性 卸载
二 IOC中装配Bean
变量前两个字母要么全部大写,要么全部小写,eg:isBatch IDCard
依赖注入:属性注入、构造注入、工厂方法注入
Bean间关系:继承(parent),依赖(depends-on),引用(idref)
Bean的作用域:singleton prototype request session globalSession
基于注解启动spring容器:ApplicationContext ct = new AnnotationConfigApplicationContext(); ct.registe(Config.class); ct.refresh();
三 Spring高级
Bean创建过程:
1.ResourceLoader 加载配置文件,生成对应的Resource
2.BeanDefinitionReader读取并解析resource,生成对应的BeanDefinition,并注册到BeanDefinitionRegister中,
3.spring扫描BeanDefinitionRegister读取BeanDeifnition,如果bean实现工厂后处理器(BeanFactoryPostProcessor),对beanDefinition进行处理
4.使用InstantiationStrategy初始化Bean,相当于new
5.使用BeanWarpper对bean进行封装,完成bean属性设置工作
6.利用容器中注册的bean后处理器(实现BeanPostProcessor接口),对bean进行后续加工
使用外部文件:使用<context:property-placeholder location=""/> 注file-encoding="utf8",使用${属性名}引用属性值
加密外部文件:1.继承PropertyPlaceholderConfigurer 重写convertProperty(String propertyName,String propertyValue)方法,2.通过传统配置方式引入配置文件 <bean class="" p:location=""/>
国际化信息
本地化格式工具:DateFormat NumberFormat MessageFormat MessageSource
四 Spring Aop
基础知识:
jdk动态代理:1.实现InvocationHandler 在invoke方法定义横切逻辑,通过反射调用目标类方法
2.通过Proxy.newProxyInstance() 为目标对象创建代理
cglib动态代理:采用底层字节码技术,为类创建子类,在子类拦截所有调用父类方法的调用,性能优于jdk代理
1.实现MethodInteceptor 在inteceptor方法定义横切逻辑
2.通过字节码创建子类代理类
增强类型:前置 后置 异常 最终 环绕 引介,引介:为目标类创建新的方法或实现,类级别
五 基于@AspectJ和Schema的spring aop
注解:
通配符:* 匹配任意字符 只能匹配上下文的一个元素
.. 匹配任意字符 匹配多个元素
+ 表示类型匹配的所有类 包括子类
切点函数:@annotation(注解) 表示标识注解的所有方法
@execution(* com.baobaotao.Waiter+.*(..)) 表示匹配Waiter 及子类的所有方法,第一个*表示返回类型
args() 针对方法签名的 入参接受指定的类
@args() 入参接受指定注解
within() 同execetion()
target(M) 目标类匹配M
@AspectJ进阶:命名切点,切点可以作为类似变量定义、引入
连接点对象,JoinPoint ProceedingJoinPoint(环绕增强)
绑定连接点方法入参,通过args绑定
绑定代理对象,通过this
绑定类注解对象 通过within()或 target()
绑定返回值,通过returning
绑定抛出的异常,通过throwing
aop方式有四种:@AspectJ <aop:aspect> Advisor <aop:advisor> 下面是对比
六 Spring对Dao的支持
DBCP数据源:BasicDataSource
initialSize 默认0 初始化连接数
maxActive 8 最大活动链接
maxIdle 8 最大空闲链接
ValidationQuery sql查询语句 mysql:select 1 oracle : select 1 from dual
testOnBorrow true 是否从池中取出链接前检查
testWhileIdle false 空闲链接是否被回收
testBetweenEvictionRunsMillis -1 空闲链接回收期运行周期
推荐testOnBorrow false,testWhileIdle true testBetweenEvictionRunsMillis一个合适值
C3P0数据源:ComboPooledDataSource
acquireIncrement 链接用完时 c3p0一次性创建的数目
initailPoolSize 初始化创建的数目
minPoolSize 连接池最小连接数 反之maxPoolSize
maxIdleTime 0 最大空闲时间,超时被丢弃 0为永不丢弃
七 Spring事务管理
事务特性:原子性 一致性 隔离性 持久性
读未提交:会脏读 不可重复读 幻读
读已提交(READ COMMITED):会不可重复读(两次读取同一记录 结果不一样) 幻读
可重复读(REPEATALBE READ):会幻读(一个事务 第一次读取到10条记录 第二次读取11条记录)
序列化(SERIALIABLE):读加共享锁 写加排它锁
ThreadLocal 原理:ThreadLocalMap 方法set(T t) get() remove() initialValue()
事务传播行为:REQUIRED 如果没有事务则新建,有事务则加入
REQUIRES_NEW 新建事务 如果当前有事务则将其挂起
SUPPORTS 支持当前事务,如果没事务则以无事务运行
NOT_SUPPROTED 以非事务方式执行 如果当前有事务则挂起
NEVER 以非事务运行 如果当前有事务 则抛出异常
NESTED 如果没有事务,就新建事务,如果有,嵌套当前事务
使用XML配置声明式事务
基于注解配置声明式事务