核心:
- IOC
- 控制反转
- 将bean创建交由spring(BeanFactory)管理
- 解耦、削减bean之间依赖关系
- AOP
- 面向切面编程
- 使用动态代理
核心容器:
- ApplicationContext
- 读取配置文件之后立即加载对象
- 单例对象适用
- BeanFactory
- 延迟加载对象
- 多例对象适用
ApplicationContext的实现:
- ClassPathXmlApplicationContext
- 加载类路径下的配置文件(xml)
- FileSystemApplicationContext
- 加载磁盘下任意路径下的文件
- AnnotationConfigApplicationContext
- 加载被@Configuration注解过的类
主要方法:
- getBean(…),获取bean对象
Bean的生命周期:
- 单例Bean
- 容器创建时创建,容器销毁时销毁,贯穿整个容器生命周期
- 多例Bean
- 从对象创建到被GC回收
注入bean(xml配置):
- 构造函数注入
- <constructor-arg></……> 指定构造方法参数
- type:全限定类名
- index:参数索引(从0开始)
- name:参数名称
- value:参数值(简单类型)
- ref:引用bean作为参数值(复杂类型)
- <constructor-arg></……> 指定构造方法参数
- set注入
- <property></……>
- name:set方法去掉set之后的名称
- value:参数值值(简单类型)
- ref:引用bean作为参数值(复杂类型)
- <property></……>
注入bean(注解配置):
- 注入到IOC容器中:
- @Component(通用)
- @Controller(controller层Bean使用)
- @Service(service层Bean使用)
- @Repository(dao层Bean使用)
- @Bean(作用方法上,方法写在配置类中,将返回值注入到IOC容器)
- @Scope(指定作用域)
- @PreConstruct(作用方法上,指定bean创建时调用)
- @PreDestory(作用方法上,指定bean销毁时调用)
- 注入Bean到对象
- @AutoWired(根据类型注入)
- @Qualifier(配合@AutoWired使用,指定bean名称)
- @Resource(根据名注入)
其他一些注解:
- @Configuration(声明是个配置类,此类和xml功能一样)
- @ComponentScan(指定spring创建容器时扫描的包,在此配置下的包中的注解才会被扫描)
- @Import(在配置类中引入其他配置类)
- @Value(将配置文件中的值赋值给被修饰的变量)
- @PropertySource(指定使用的properties文件)
- @RunWith(SpringJUnit4ClassRunner.class)(使用Spring与junit的整合)(注解不是spring的,里面的class是spring的)
- @ContextConfiguration(指定使用的配置文件/配置类)
- @Transaction(事务)
- ……
AOP术语:
- Joinpoint(连接点):可以被增强的方法
- Pointcut(切入点):实际被增强的方法
- Advice(通知/增强):对方法增强的内容
- 前置通知:切入点方法执行之前执行
- 后置通知:切入点方法正常直接结束后执行
- 异常通知:切入点方法执行异常执行
- 最终通知:方法结束后执行,无论方法执行正常、异常与否
- 环绕通知:环绕切入点方法前后执行,通知代码中需手动调用切入点方法
- Target(目标对象):被代理对象
- Weaving(织入):将增强引用到目标对象创建代理对象的过程
- Aspect(切面):切入点和通知的结合
AOP配置:
- 基于xml
- <aop:config>配置aop的父标签
- <aop:aspect>配置aop
- <aop:before>配置前置通知
- <aop:after-returning>配置后置通知
- <aop:after-throwing>配置异常通知
- <aop:after>配置最终通知
- ……
切入点表达式:
execution(访问修饰符 返回值类型 包名.类名.方法名(参数列表))
修饰符可以省略,其他的可以使用通配符
- 基于注解
- @Before(前置通知)
- @AfterReturnning(后置通知)
- @AfterThrowing(异常通知)
- @After(最终通知)
- @Around(环绕通知)
- @Aspect(表示是个切面类)
- @Pointcut(定义切入点表达式,作用在方法上,通知注解的值为被此注解修饰的方法名())
- @EnableAspectJAutoProxy(是啥呢)
都是 org.aspectj.lang.annotation 包中
声明式事务:
使用@Transaction注解
- value:transactionManager别名
- transactionManager:可用于确定目标事务管理器
- label: 标签可能仅用于描述目的或映射到预定义的事务管理器特定选项
- propagation:事务的传播行为
- Propagation.REQUIRED:如果有事务, 那么加入事务, 没有的话新建一个(默认)
- Propagation.SUPPORTS:如果有事务,继续使用,如果没有,那就不用事务
- Propagation.MANDATORY:支持当前事务,如果不存在则抛出异常
- Propagation.REQUIRES_NEW:创建一个新事务,如果当前存在事务,则暂停当前事务
- Propagation.NOT_SUPPORTED:以非事务方式执行,如果存在则暂停当前事务
- Propagation.NEVER:以非事务方式执行,如果存在事务则抛出异常
- Propagation.NESTED:如果当前事务存在,则在嵌套事务中执行,否则行为类似于REQUIRED
- isolation:事务的隔离级别,默认使用底层数据存储的隔离级别
- Isolation.READ_UNCOMMITTED
- 读未提交
- 脏读√、不可重复读√、幻读√
- Isolation.READ_COMMITTED
- 读已提交
- 脏读×、不可重复读√、幻读√
- Isolation.REPEATABLE_READ
- 可重复读
- 脏读×、不可重复读×、幻读√
- Isolation.SERIALIZABLE
- 串行化
- 脏读×、不可重复读×、幻读×
- timeout:事务超时时间、秒为单位、数字
- timeoutString:事务超时时间、秒为单位、字符串
- readOnly:设置当前为只读事务
- rollbackFor:抛出某个/些异常时候回滚,值为异常类class
- rollbackForClassName:抛出某个/些异常时候回滚,值为异常名
- noRollbackFor:抛出某个/些异常时候不回滚,值为异常类class
- noRollbackForClassName:抛出某个/些异常时候不回滚,值为异常名
- Isolation.READ_UNCOMMITTED