Spring揭秘笔记.docx
《Spring揭秘笔记.docx》由会员分享,可在线阅读,更多相关《Spring揭秘笔记.docx(45页珍藏版)》请在冰豆网上搜索。
![Spring揭秘笔记.docx](https://file1.bdocx.com/fileroot1/2022-11/25/6b629d37-17b8-41b6-ba04-9ebbfb877157/6b629d37-17b8-41b6-ba04-9ebbfb8771571.gif)
Spring揭秘笔记
Sping揭秘
学习笔记
[2015年3月1日]
目录
Q1.Spring总体结构1
Q2.IoC的基本概念1
Q3.Ioc注入的方式1
3.1构造方法注入(constructorinjection)1
3.2setter方法注入(setterinjection)1
3.3接口注入(interfaceinjection)。
1
Q4.IoCServiceProvider2
Q5.IoCServiceProvider如何管理对象间的依赖关系2
直接编码方式2
配置文件方式2
元数据方式2
Q6.IoC容器和IoCServiceProvider的关系2
Q7.BeanFactory和ApplicationContext2
7.1BeanFactory。
2
7.2ApplicationContext2
Q8.BeanFactory的运作原理3
8.1BeanFactory的初始化3
8.2外部配置文件方式4
Q9.Beans的全局配置4
Q10.继承注入4
Q11.bean的scope4
11.1singleton4
11.2prototype4
11.3request、session和globalsession5
Q12.自定义scope类型5
Q13.工厂方法与FactoryBean5
13.1静态工厂方法5
13.2非静态工厂方法(InstanceFactoryMethod)5
13.3FactoryBean5
Q14.使用BeanFactoryAware接口获得beanFactory6
Q15.使用ObjectFactoryCreatingFactoryBean6
Q16.方法替换7
Q17.插手“容器的启动”7
17.1PropertyPlaceholderConfigurer7
17.2PropertyOverrideConfigurer7
17.3CustomEditorConfigurer7
Q18.Bean的生命周期9
Q19.Spring的Aware接口9
19.1针对BeanFactory类型的容器9
19.2针对ApplicationContext类型的容器9
Q20.BeanPostProcessor10
20.1将自定义的BeanPostProcessor注册到容器10
Q21.插手“Bean的生灭”10
21.1InitializingBean和init-method10
21.2DisposableBean与destroy-method10
Q22.统一资源加载策略11
22.1URL的问题11
22.2Spring中的Resource11
22.3ResourceLoader—更广义的URL11
Q23.ApplicationContext与ResourceLoader12
23.1Resource类型的注入12
Q24.Java国际化信息支持简介13
Q25.Spring国际化支持13
25.1可用的MessageSource实现14
Q26.Java事件发布概述14
Q27.Spring的容器内事件发布类结构分析15
Q28.Spring容器内事件发布的应用16
Q29.使用ApplicationContext加载多个配置文件16
Q30.注解版的自动绑定17
30.1Xml文件形式的自动绑定回顾17
30.2@Autowired17
30.3实现原理17
30.4@Qualifier17
30.5使用JSR250标注依赖注入关17
Q31.启用注解的简单方法17
Q32.classpath-scanning18
Q1.Spring总体结构
Q2.IoC的基本概念
InversionofControl,中文通常翻译为“控制反转”,它还有一个别名叫做依赖注入(DependencyInjection)。
当某一个类需要依赖其他类工作时,不需要new对象而可以通过多种方式注入进来。
IoC是一种可以帮助我们解耦各业务对象间依赖关系的对象绑定方式!
Q3.Ioc注入的方式
3.1构造方法注入(constructorinjection)
这种注入方式的优点就是,对象在构造完成之后,即已进入就绪状态,可以马上使用。
缺点就是,当依赖对象比较多的时候,构造方法的参数列表会比较长。
3.2setter方法注入(setterinjection)
因为方法可以命名,所以setter方法注入在描述性上要比构造方法注入好一些。
缺点当然就是对象无法在构造完成后马上进入就绪状态。
3.3接口注入(interfaceinjection)。
从注入方式的使用上来说,接口注入是现在不甚提倡的一种方式,基本处于“退役状态”。
因为它强制被注入对象实现不必要的接口,带有侵入性。
而构造方法注入和setter方法注入则不需要如此。
●使用的setter方法注入和使用可以同时使用
Q4.IoCServiceProvider
IoCServiceProvider在这里是一个抽象出来的概念,它可以指代任何将IoC场景中的业务对象绑定到一起的实现方式。
它可以是一段代码,也可以是一组相关的类,甚至可以是比较通用的IoC框架或者IoC容器实现。
IoCServiceProvider的职责:
业务对象的构建管理和业务对象间的依赖绑定。
Q5.IoCServiceProvider如何管理对象间的依赖关系
5.1直接编码方式
5.2配置文件方式
5.3元数据方式
Q6.IoC容器和IoCServiceProvider的关系
Spring的IoC容器和IoCServiceProvider所提供的服务之间存在一定的交集,二者的关系如图所示。
Q7.BeanFactory和ApplicationContext
7.1BeanFactory。
基础类型IoC容器,提供完整的IoC服务支持。
默认采用延迟初始化策略(lazy-load)
//Spring4.1废弃
BeanFactorycontainer=newXmlBeanFactory(newClassPathResource("配置文件路径"));
BeanFactorycontainer=newClassPathXmlApplicationContext("配置文件路径");
BeanFactorycontainer=newFileSystemXmlApplicationContext("配置文件路径");
7.2ApplicationContext
ApplicationContext在BeanFactory的基础上构建,是相对比较高级的容器实现,除了拥有BeanFactory的所有支持,ApplicationContext除了拥有BeanFactory支持的所有功能之外,还进一步扩展了基本容器的功能,包括BeanFactoryPostProcessor、BeanPostProcessor以及其他特殊类型bean的自动识别、容器启动后bean实例的自动初始化、国际化的信息支持、容器内事件发布等。
使用立即初始化策略。
以下几个常用的实现:
FileSystemXmlApplicationContext
ClassPathXmlApplicationContext
XmlWebApplicationContext
Q8.BeanFactory的运作原理
8.1BeanFactory的初始化
//BeanDefinition代表Bean的定义
AbstractBeanDefinitionnewsProvider=newRootBeanDefinition(FXNewsProvider.class,true);
指定依赖关系
//1.可以通过构造方法注入方式
ConstructorArgumentValuesargValues=newConstructorArgumentValues();
argValues.addIndexedArgumentValue(0,newsListener);
argValues.addIndexedArgumentValue(1,newsPersister);
newsProvider.setConstructorArgumentValues(argValues);
//2.或者通过setter方法注入方式
MutablePropertyValuespropertyValues=newMutablePropertyValues();
propertyValues.addPropertyValue(newpropertyValue("newsListener",newsListener));
newsProvider.setPropertyValues(propertyValues);
DefaultListableBeanFactoryregistry=newDefaultListableBeanFactory();
registry.registerBeanDefinition("djNewsProvider",newsProvider);
(BeanFactory)registry.getBean("newsListener")
DefaultListableBeanFactory实现了BeanDefinitionRegistry接口和BeanFactory接口
BeanDefinition放入BeanDefinitionRegistry,实现元信息配置,再通过BeanFactory获得完成职责。
8.2外部配置文件方式
BeanDefinitionReader的相应实现类负责将相应的配置文件内容读取并映射到BeanDefinition,然后将映射后的BeanDefinition注册到一个BeanDefinitionRegistry,之后,BeanDefinitionRegistry即完成Bean的注册和加载。
1.Properties配置格式的加载
PropertiesBeanDefinitionReader类用于Properties格式配置文件的加载
2.XML配置格式的加载
XmlBeanDefinitionReader类用于XML格式配置文件的加载
3.注解方式
Q9.Beans的全局配置
default-lazy-init。
其值可以指定为true或者false,默认值为false。
用来标志是否对所有的进行延迟初始化。
default-autowire。
可以取值为no、byName、byType、constructor以及autodetect。
默认值为no,如果使用自动绑定的话,用来标志全体bean使用哪一种默认绑定方式。
default-dependency-check。
可以取值none、objects、simple以及all,默认值为none,即不做依赖检查。
default-init-method。
如果所管辖的按照某种规则,都有同样名称的初始化方法的话,可以在这里统一指定这个初始化方法名,而不用在每一个上都重复单独指定。
default-destroy-method。
与default-init-method相对应,如果所管辖的bean有按照某种规则使用了相同名称的对象销毁方法,可以通过这个属性统一指定。
Q10.继承注入
Q11.bean的scope
11.1singleton
标记为拥有singletonscope的对象定义,在Spring的IoC容器中只存在一个实例,所有对该对象的引用将共享这个实例。
标记为singleton的bean是由容器来保证这种类型的bean在同一个容器中只存在一个共享实例;而Singleton模式则是保证在同一个Classloader中只存在一个这种类型的实例。
11.2prototype
针对声明为拥有prototypescope的bean定义,容器在接到该类型对象的请求的时候,会每次都重新生成一个新的对象实例给请求方。
11.3request、session和globalsession
Q12.自定义scope类型
publicinterfaceScope{
Objectget(Stringname,ObjectFactoryobjectFactory);
Objectremove(Stringname);
voidregisterDestructionCallback(Stringname,Runnablecallback);
StringgetConversationId();
}
Q13.工厂方法与FactoryBean
提供一个工厂类来实例化具体的接口实现类,这样,主体对象只需要依赖工厂类,具体使用的实现类有变更的话,只是变更工厂类,而主体对象不需要做任何变动。
13.1静态工厂方法
13.2非静态工厂方法(InstanceFactoryMethod)
因为工厂方法为非静态的,我们只能通过某个NonStaticBarInterfaceFactory实例来调用该方法(哦,错了,是容器来调用),那么也就有了如下的配置内容:
13.3FactoryBean
一种可以扩展容器对象实例化逻辑的接口,请不要将其与容器名称BeanFactory相混淆。
FactoryBean,其主语是Bean,定语为Factory,也就是说,它本身与其他注册到容器的对象一样,只是一个Bean而已,只不过,这种类型的Bean本身就是生产对象的工厂(Factory)。
publicclassNextDayDateFactoryBeanimplementsFactoryBean{
publiccObjectgetObject()throwsException{
returnnewDateTime().plusDays
(1);
}
publicClassgetObjectType(){
returnDateTime.class;
}
publicBooleanisSingleton(){
returnfalse;
}
}
Spring容器内部许多地方了使用FactoryBean:
JndiObjectFactoryBean、LocalSessionFactoryBean、SqlMapClientFactoryBeanProxyFactoryBean、TransactionProxyFactoryBean
Q14.使用BeanFactoryAware接口获得beanFactory
publicclassMockNewsPersisterimplementsIFXNewsPersister,BeanFactoryAware{
privateBeanFactorybeanFactory;
publicvoidsetBeanFactory(BeanFactorybf)throwsBeansException{
this.beanFactory=bf;
}
}
Q15.使用ObjectFactoryCreatingFactoryBean
ObjectFactoryCreatingFactoryBean是Spring提供的一个FactoryBean实现,它返回一个ObjectFactory实例。
从ObjectFactoryCreatingFactoryBean返回的这个ObjectFactory实例可以为我们返回容器管理的相关对象。
实际上,ObjectFactoryCreatingFactoryBean实现了BeanFactoryAware接口,它返回的ObjectFactory实例只是特定于与Spring容器进行交互的一个实现而已。
使用它的好处就是,隔离了客户端对象对BeanFactory的直接引用。
publicclassMockNewsPersisterimplementsIFXNewsPersister{
privateObjectFactorynewsBeanFactory;
publicvoidpersistNews(FXNewsBeanbean){
persistNews();
}
publicvoidpersistNews(){
System.out.println("persistbean:
"+getNewsBean());
}
publicFXNewsBeangetNewsBean(){
returnnewsBeanFactory.getObject();
}
publicvoidsetNewsBeanFactory(ObjectFactorynewsBeanFactory){
this.newsBeanFactory=newsBeanFactory;
}
}
相关配置
class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
Q16.方法替换
与方法注入只是通过相应方法为主体对象注入依赖对象不同,方法替换更多体现在方法的实现层面上,它可以灵活替换或者说以新的方法实现覆盖掉原来某个方法的实现逻辑。
publicclassFXNewsProviderMethodReplacerimplementsMethodReplacer{
privatestaticfinaltransientLoglogger=LogFactory.getLog(FXNewsProviderMethodReplacer.class);
publicObjectreimplement(Objecttarget,Methodmethod,Object[]args)throwsThrowable{
logger.info("beforeexecutingmethod["+method.getName()+"]onObject["+target.getClass().getName()+"].");
System.out.println("sorry,Wewilldonothingthistime.");
logger.info("endofexecutingmethod["+method.getName()+"]onObject["+target.getClass().getName()+"].");
returnnull;
}
}
Q17.插手“容器的启动”
Spring提供了一种叫做BeanFactoryPostProcessor的容器扩展机制。
该机制允许我们在容器实例化相应对象之前,对注册到容器的BeanDefinition所保存的信息做相应的修改。
Spring已经提供了几个现成的BeanFactoryPostProcessor实现类:
17.1PropertyPlaceholderConfigurer
用类替换配置文件中的${}参数
17.2PropertyOverrideConfigurer
用来覆盖配置文件中的属性
17.3CustomEditorConfigurer
CustomEditorConfigurer是另一种类型的BeanFactoryPostProcessor实现,它只是辅助性地将后期会用到的信息注册到容器,对BeanDefinition没有做任何变动。
PropertyEditor用来根据该对象类型取得与其相对应的PropertyEditor来做具体的类型转换。
下是这些Spring提供的部分PropertyEditor:
StringArrayPropertyEditor、ClassEditor、FileEditor、LocaleEditor、PatternEditor。
●自定义PropertyEditor。
publicclassDatePropertyEditorextendsPropertyEditorSupport{
privateStringdatePattern;
@Override
publicvoidsetAsText(Stringtext)throwsIllegalArgumentException{
DateTi