准备开始看看Spring源码, 所以把Spring复习一遍,做下笔记..
一. Spring的4种关键策略:
1. 基于POJO的轻量级和最小入侵编程(基本不出现在业务逻辑中, 不用强制实现接口之类的);
2. 通过依赖注入和面向接口来实现松耦合;
3. 基于切面和惯例进行声明式编程;
4. 通过切面(减少重复调用)和模版减少样板式代码(比如JDBC那些重复的连接配置)。
二. 两个核心概念:依赖注入和AOP
Bean的依赖注入:
1. 构造器注入属性 (及通过构造器注入所需的类, 在XML中作相应配置)
- 使用类默认public构造器
- 使用<bean><constructor-arg value="传普通类型参数" 或用 ref="传对象引用"><bean>定义public构造器 参数
- 如果没有public的构造器, 用<bean id="" class="" factory-method="获取单例的方法" />
2. 设值注入属性(getter和setter:实例化时注入)
- <bean><property name="" value="传普通类型参数" 或用 ref="传对象引用"><bean>
- 如果Bean不想被共享可以设置成内部Bean, <bean><property name="" ref=""><bean class=""></property><bean>
3. SpEL(Spring表达式语言 : #{expression},Spring3.0开始支持)
- 使用Bean的ID来引用Bean
- 调用方法和访问对象属性
- 对值进行算术、关系和逻辑运算
- 正则表达式匹配
- 集合操作
4. 注解(XML配置<context:annotation-config>【不用写<property>和<constructor-arg>】---升级---》》<context:component-scan base-package="">【连Bean都可以不用写了】)
- @Autowired [ (required=false) ]这样没有Bean也行: byType自动装配,如果找不到还可以用@Qualifier("")通过byName方式缩小范围
- @Inject 与@Autowired不同的是无required属性,但有与@Qualifier("")对应的@Named("")
- @Bean 基于Java方式的注入, 有编译检查, 不能同名。
component-scan扫描的类(stereotype):
@Component -- 表示为Spring组件(它的具体化有@Controller等)
@Controller -- SpringMVC的Controller 相当于Struts2的控制
@Repository -- 表示数据仓库
@Service -- 服务层
Bean的作用域(通过scope属性定义):
Bean的初始化和销毁:
<bean id="" class="" init-method="执行一些Bean实例化时调用的方法" destroy-method="执行一些Bean销毁时调用的方法" />
AOP:
通过声明的方式将他们应用(在Spring配置文件中配置)到它们需要影响的组件中去, 是各个组件专注于自身的业务, 而不用把日志、事务之类的代码耦合(调用或者直接在组件实现)到组件的业务逻辑中去。
AOP在Spring配置文件中的配置:
<aop : config><aop:aspect ref="logBean , safeBean Or...切面.">
<aop:pointcut id="you logistic bean" expression="execution(* *.切点业务方法)" /><aop:before pointcut-ref="you logistic bean" method="前置切面方法"><aop:after pointcut-ref="you logistic bean" method="后置切面方法"></aop:aspect></aop : config>
execution[在方法执行时触发](*[返回任意类型] com.weniuwuren[包名].method[方法名](..[参数]))
&& [ || ] [ ! ] within(com.wenniuwuren.*)
表达式:
通知器:
AOP核心名词:
其中,切点(where)定义了哪些连接点会得到通知(what,when)。
当然,切面还有个很强大的功能。为Java这个非动态语言, 添加新Method(以上描述的是新增功能:安全,日志)。
<aop:declare-parents
types-matching="实现类"
implement-interface="要被实现的接口"
default-impl="" or deltegate-ref=""/>
三. Spring容器(创建Bean, 装配他们, 配置他们, 管理他们的整个生命周期):
Bean Factory最基本容器 ---- 基于这个之上又建立Application(应用上下文)
Application分为三类:
-ClassPathXmlApplicationContext : 读取类路径下的XML配置文件加载Application
-FileSystemXmlApplicationContext : 读取文件系统下的XML配置文件并加载Application
-XmlWebApplicationContext : 读取Web应用下的XML配置文件并加载Application
通过下图命名空间配置容器(常用就是Beans了)
四. Spring生命周期
上图解释:
1. Bean实例化
2. 填充属性----Spring将值和Bean的引用注入Bean对应属性中
3. 如果Bean实现了BeanNameAware接口, Spring将Bean的ID传给setBeanName()方法
4. 如果Bean实现了BeanFactoryAware接口, 将调用setBeanFatory()方法将Beanfactory实例传入
5. 如果Bean实现了ApplicationContextAware接口, 将调用setApplicationContext()方法将上下文引用传入
6. 如果实现了BeanPostProcessor接口, 将调用相应预初始化方法
7. InitializingBean初始化
8. 如果实现了BeanPostProcessor接口, 将调用相应后初始化方法
9. Bean可以使用了, 它们将在ApplicationContext中直到, ApplicationContext被销毁
10. DisposableBean销毁
以上步骤均可自定义一些操作。
五. 事务(在XML中用tx命名空间定义, <tx:annotation-driven transaction-manager="transactionManager"/>)
Spring以来以下5个参数来控制如何管理事务。
<1> propagation behavior(传播行为):客户端与被调用方法之间的事务边界。 [事务应该被启动还是挂起,方法是否在事务中运行]
<2> isolation level(隔离级别):一个事务可能受其他并发事务影响的程度。
<3> read only(只读):是否为只读事务。只读优化是由事务启动时数据库实施的, 只对启动一个新事务(PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED)才有意义。
<4> timeout(事务超时) 事务开始时启动,所以只对启动一个新事务(PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED)才有意义。
<5> roll back(回滚原则)
六. Spring框架模块