《spring 技术手册》学习笔记

[align=center][img]http://images.china-pub.com/ebook30001-35000/34710/shupi.jpg[/img][/align]

spring是平时工作中用的最多的一个框架了, 一些基本的东西基本上是人人都会, 一时想不起来查查参考手册也可以马上"精通". <spring技术手册>可以用来入门, 也可以用来查缺补漏, 今天信手翻来, 学到了一些新知, 也算巩固了以前的内容. 作者貌似花了很大的篇幅在讲解spring mvc, 这块儿基本上工作中没有用到. 前面讲的aop算是一个比较全的东东, 比参考手册要细致些, 值得一看.

一个bean从建立到销毁的过程:
由BeanFactory读取bean配置文件, 并生成bean实例
执行相关的bean属性依赖注入
如果bean类有实现BeanNameAware接口, 则执行它的setBeanName()方法
如果bean类有实现BeanFactoryAware接口, 则执行它的setBeanFactory()方法
如果是ApplicationContext管理的bean, 且实现了ApplicationContextAware接口, 会执行setApplicationContext()方法
如果任何的BeanPostProcessor实例与Bean实例关联, 则执行其postProcessBeforeInitialization()方法
如果Bean类实现了InitializingBean接口, 则执行它的afterPropertiesSet()方法
如果bean定义中指定了init-method方法, 则执行之
执行BeanPostProcessor的postProcessAfterInitialization()方法, 如果有的话
如果bean实现了DisposableBean接口, 则执行destory()方法
如果bean定义指定了destroy-method放, 执行之


ApplicationContext相对于BeanFactory提供了更多的功能:资源获取, 消息解析, 事件处理和传播
ApplicationContext继承了ResourceLoader接口, 可以使用getResource方法指定资源文件的url来取得一个实现了Resource接口的实例.比如:
Resource resource = context.getResource("classpath:admin.properties");
classpath是spring自制的url虚拟协议, 得到的是一个ClassPathResource实例, 在取得一个resource接口实例之后, 可以使用getFile, getInputStream方法来获取资源文件的相关资源, Resource只是资源文件的一个抽象, 可以通过exists()来检测资源文件是否存在.

动态代理
动态代理中的代理对象可以适应任何被代理对象, 这也是其之所以为"动态"的原因. java的动态代理, 只需要创建一个handler就可以服务各种对象, 但是有一点就是这个handler必须实现InvocationHandler接口. 在该接口的bind()方法中, 通过Proxy.newProxyInstance()创建一个代理对象, 建立代理对象时必须告知所代理的接口, 之后可以在invoke方法中对该代理对象进行操作.

AOP中的aspect所指的是类似log这样的行为, 可以将这些行为设计为通用的, 不介入特定业务对象的一个职责清楚的Aspect对象, 这就是Aspect-oriented programming.

一些概念
Aspect: 将散落在各个业务对象之中的cross-cutting concerns收集起来, 设计为可重用的对象, 这些对象就是Aspect.
Advice:Aspect的具体实现称之为Advice, 比如log功能的代码实现.
Joinpoint:Aspect在应用程序执行时加入业务流程的点或时机称之为Joinpoint. 具体的说就是Advice在应用程序中执行的时机.
Poincut: 它是一个定义, 根据这个定义, 可以指定某个Aspcet在哪些Joinpoint时被植入应用程序中, 换句话说就是用一个配置来定义Aspect在应用中的Joinpoint. 可以理解一种定义advice在具体的Joinpoint被植入表达式.
Target: 一个Aspect被应用的目标对象
Introduction: 给对象增加行为而不是修改行为就称之为Introduction. 可以当成一种Adpeter
Proxy: 用来完成将Adivce植入Target的对象就是Proxy, 也是我们真正要使用的对象

PointcutAdvisor类用来将Pointcut和Advice结合为一个对象

Pointcut类定义了根据类名和方法名来定义来决定是否使用Advice.

ControlFlowPointcut用来在方法的执行堆栈中, 某个指定类的某方法中, 植入advice. 也就是在运行期提供动态的Pointcut功能.
比如这样的配置:
<bean id = "pointcut" class= "...ControlFlowPointcut">
<constructor-arg><value>...Foo</value></constructor-arg>
</bean>
<bean id = "advisor" class="..PointcutAdvisor">
<property name="advice" value="log"/>
<property name="pointcut" value="pointcut"/>
</bean>
<bean id = "bar" class = "...Bar"/>
<bean id = "proxyBar" class = "...ProxyFactoryBean">
<property name = "proxyInterfaces">..</property>
<property name = "target">bar</property>
<property name = "interceptorName">advisor</property>
</bean>

这个配置的意思在Foo的调用堆栈中调用了Bar的方法时, 则执行log动作.

AutoProxyCreator 可以自动来创建代理对象, 这样对target对象的调用自动跳到对代理对象的调用, BeanNameAutoProxyCreator就是Spring提供的常用自动代理对象创建器之一

spring的命名也是值得学习的, 比如匹配的方法名matches, 组合类会带前缀Composable, 采用模板模式的类都有Template后缀.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值