我今天学习了徐老师讲的Spring知识,我做了简单的笔记:
反向控制(IOC) :
bean工厂:最简单的容器,提供了基础的依赖注入支持。创建各种类型的Bean.
应用上下文:建立在bean工厂基础之上,提供系统架构服务。
ClassPathXmlApplicationContext:从类路径中加载。
FileSystemXmlApplicationContext:从文件系统加载。
XmlWebApplicationContext:从web系统中加载。
应用上下文与bean 工厂的区别:
bean工厂延迟加载所有bean,直到getBean()方法被调用。
应用上下文会在启动后预载入所有单例bean.这样可确保应用不需要等待他们被创建。
bean 的生命周期
bean被载入到容器中时,他的生命周期就开始了。bean工厂在一个bean可以使用前完成很多工作:
1.容器寻找bean的定义信息并实例化。
2.使用依赖注入,spring按bean定义信息配置bean的所有属性。
3.若bean实现了BeanNameAware接口,工厂调用Bean的setBeanName
()方法传递bean的ID。
4.若bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()
方法传入工厂自身。
5.若BeanPostProcessor和bean关联,则它们的
postProcessBeforeInitialization()方法被调用。
6.若bean指定了ini-method方法、,它将被调用。
7.最后,若有BeanPostProcessor和bean关联,则它们的
postProcessAfterInitialization()方法被调用、。
将bean从工厂中删掉有两种方法:
1.若bean实现了DisposableBean接口,
distroy()方法被调用。
2.如果指定了定制的销毁方法,就调用这个方法。
bean在应用上下文中的生命周期和在bean工厂
的生命周期唯一不同的是:若bean实现了
ApplicationContextAware()接口,
setApplicationContext()方法会被调用。
对bean 工厂进行后处理:
BeanPostProcessor在bean载入后,对bean进行一些后处理工作。而BeanFactoryPostProcessor在bean工厂载入所有bean的定义后,实例化bean之前,对Bean工厂做一些后处理工作。
public interface BeanFactoryPostProcessor{
public void postProcessorBeanFactory(…);
}
如果使用的是应用上下文不需要将他注册为Bean工厂后处理器。上下文会自动注册它。按照正常的Bean声明即可。
定制属性编辑器:
class PhoneEditor extends java.beans.PropertyEditorSupport
在xml文件里面配置编辑器:
<bean class="..CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="Phone">
<bean id="phoneEditor" class="PhoneEditor"/>
</entry>
</map>
</property>
</bean>
<bean id="contact" class="Contact">
<property name=phoneNumber value="888-555-1212" />
</bean>
感知其他bean :
运行在spring容器中的bean不知道自己的注册名,运行在哪里。实现以下三个接口:
BeanNameAware:知道自己的名字。
BeanFactoryAware:所处的bean工厂。
ApplicationContextAware:所在上下文
Spring 的AOP :
AOP 术语
1.切面(aspect):要实现的交叉功能,是系统模块化的一个切面或领域。如日志记录。
2.连接点:应用程序执行过程中插入切面的地点,可以是方法调用,异常抛出,或者要修改的字段。
3.通知:切面的实际实现,他通知系统新的行为。如在日志通知包含了实现日志功能的代码,如向日志文件写日志。通知在连接点插入到应用系统中。
4.切入点:定义了通知应该应用在哪些连接点,通知可以应用到AOP框架支持的任何连接点。
5.引入:为类添加新方法和属性。
6.目标对象:被通知的对象。既可以是你编写的类也可以是第三方类。
7.代理:将通知应用到目标对象后创建的对象,应用系统的其他部分不用为了支持代理对象而改变。
8.织入:将切面应用到目标对象从而创建一个新代理对象的过程。织入发生在目标对象生命周期的多个点上:
编译期:切面在目标对象编译时织入.这需要一个特殊的编译器.
类装载期:切面在目标对象被载入JVM时织入.这需要一个特殊的类载入器.
运行期:切面在应用系统运行时织入.
今天学的知识就是这些了,希望明天有更好的状态学习。