《Spring攻略》 第1章 Spring简介 - IoC基础

1实例化SpringIoC容器

问题:
你必须实例化Spring IoC容器,读取配置来创建bean实例。然后,你可以从Spring IoC容器中得到可用的bean实例。


解决方案:
Spring提供了两种IoC容器实现类型。基本的一种称为Bean工厂(Bean Factory)。另一种称为应用程序上下文(Application Context),这是对bean工厂的一种兼容扩展。
这两种IoC容器类型和Bean配置文件相同。
ApplicationContext接口是用于保持兼容性的BeanFactory的子接口。


工作原理:
实例化应用程序上下文-
各种实现加载文件方式ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、XmlWebApplicationContext等


从IoC容器中得到bean-
为了从bean工厂或者应用程序上下文中得到已声明的bean,你只需要调用getBean()方法并且传递唯一的bean名称,返回Object。


2配置Spring IoC容器中的bean

问题:
Spring提供了一个强大的IoC容器来管理组成应用的Bean。为了使用,你必须配置。


解决方案:
你可以通过XML配置文件、属性文件等方式进行配置。
在简单应用中你可以使用单个配置文件,但是在庞大的系统中一般都会分模块存在多个配置文件或者按照架构层次进行分割。


工作原理:


helloworld:


1、两种基本的简单IoC




2、为Bean配置集合
就是包括基本的List、Set、Map等,基本用法没有什么好说的
但是,当你使用继承的时候,可以使用<list merge="true">来在子类中声明合并父类,但是会放在父类的序列之后。



3调用构造程序创建bean

问题:
你想要调用构造程序在Spring IoC容器中创建 一个bean,这是创建Bean最常见和直接的方法。


解决方案:
通常,当你为一个Bean指定class属性,就将要求Spring IoC容器调用构造程序创建Bean实例。


工作原理:


这里就是为什么如果不不含构造器的IoC,还没有默认无参构造器的时候,会报错Instantiation of bean failed的原因。



4解决构造程序歧义

问题:
当你为Bean指定一个或者多个构造程序参数时,Spring将视图在Bean类中查找对应的构造程序,并且传递用于Bean实例化的参数。


解决方案:
你可以为<constructor-arg>元素指定type和index属性,帮助Spring查找预期的构造程序。


工作原理:
从下面的地方开始说



5指定Bean引用



6为集合元素指定数据类型

问题:
默认情况下,Spring将集合中所有元素作为字符串对待。
如果你不打算将集合元素作为字符串使用,就必须为他们指定数据类型。


解决方案:
可以使用<value>的type指定,也可以在集合标记中指定value-type


工作原理:




具体的封装从BeanDefinitionValueResolver开始说:
然后又借助TypeConverter类型转换器
-->
借助BeanWrapperImpl来获取获取BeanWrapper
-->
借助TypeConverterDelegate进行帮助类型转换
-->
TypeConverterDelegate调用doConvertTextValue
-->
利用包org.springframework.beans.propertyeditors里的各种类型转换辅助工具类进行数据复制和对象获取。
当然具体类型转换还需要靠如NumberUtils


7使用Spring的FactoryBean创建bean

问题:
你可能希望用Spring的工厂Bean在Spring IoC容器中创建Bean。
工厂Bean(Factory Bean)是作为创建IoC容器中其他Bean的工厂的一个FactoryBean。概念上,工厂Bean与工厂方法非常类似,但是他是Bean构造期间可以Spring IoC容器识别为Spring专用Bean。


解决方案:
工厂Bean的要求是实现FactoryBean接口。为了方便,提供了抽象模板类AbstractFactoryBean供你扩展。
工厂Bean主要用于实现框架机制。如:
·在JNDI中查找对象(例如一个数据源)时,你可以使用JndiObjectFactoryBean。
·使用经典Spring AOP为一个Bean创建代理时,可以使用ProxyFactoryBean。
·在IoC容器中创建一个Hibernate会话工厂时,可以使用LocalSessionFactoryBean。


工作原理:
尽管你很少有必要编写自定义的工厂Bean,但是会发现通过一个实例来理解其内部机制很有帮助。
通过扩展AbstractFactoryBean类,你的工厂bean能够重载createInstance()方法以创建目标Bean实例。
此外,你必须getObjectType()方法中返回目标Bean的类型,是自动装配(Auto-wiring)功能正常工作。
名称之前添加&,可以得到工厂Bean的实例。



8使用工厂Bean和Utility Schema定义集合

问题:
使用基本集合标记定义集合时,你不能指定集合的实体类,例如LinkedList、TreeSet或TreeMap,而且,你不能通过将集合定义为可供其他Bean引用的单独Bean在不同的Bean中共享集合。


解决方案:
两种方式
1、使用对应的集合工厂Bean,如ListFactoryBean、SetFactoryBean和MapFactoryBean。
2、引入util schema中使用集合标记,如<util:list>、<util:set>和<util:map>。


工作原理:




9用依赖检查属性

问题:
在大规模的应用中,IoC容器中可能声明了几百个甚至几千上万个Bean,这些Bean之间的依赖往往非常复杂。
设置方法注入的不足之一是无法确定一个属性将会被注入。
检查所有必要的属性是否已经设置是非常困难的。




解决方案:
dependency-check --
none* 不执行任何依赖检查,任何属性都可以保持未设置状态
simple 如果任何简单类型(原始和集合类型)的属性未设置,将抛出UnsatisfiedDependencyException异常
objects 如果任何对象类型属性没有设置,将抛出UnsatisfiedDependencyException异常
all 如果任何类型的属性为设置,将抛出UnsatisfiedDependencyException异常


工作原理:
不过在新的版本中已经废弃


10用@Required注解检查属性



11用XML配置自动装配Bean

问题:
当一个Bean需要访问另一个Bean时,你可以显示指定引用装配他。但是,如果你的容器能够自动装配bean,就可以免去手工手工配置装配的麻烦。


解决方案:
autowire属性--
no* 不执行自动装配。你必须显示的装配依赖
byName 对于每个Bean属性,装配一个同名的bean
byType 对于每个Beam属性,装配类型与之兼容的Bean。如果超过一个,将抛出UnsatisfiedDependencyException异常。
Constructor 对于每个构造程序参数,首先寻找与参数兼容的Bean。然后,选择具有最多参数的构造程序。对于存在歧义的情况,将抛出UnsatisfiedDependencyException异常。
autoetect 如果找到一个没有参数的默认构造程序,依赖讲按照类型自动装配。否则,将由构造程序自动装配。


(不建议用自动装配)


工作原理:



12用@Autowired和@Resource自动装配Bean

问题:
在Bean配置文件中设置autowire属性进行的自动装配将装配一个Bean的所有属性。这样的灵活性不足以紧紧装配特定的属性。
而且,你只能通过类型或者名称自动装配Bean。
如果这两种策略都不能满足你的需求,就必须明确的装配Bean。


解决方案:
你可以通过@Autowired或者@Resource注解一个设置方法、构造程序、字段甚至任意方法自动装配特定的属性。
这意味着你除了设置autowire属性之外,还有一个能够满足需求的选择。


工作原理:
<context:annotation-config />


@Autowired、@Qualifier("mainCatalog")、@Resource(name="myMovieFinder")



13继承Bean配置




14从Classpath中扫描组件




你可能感兴趣的:(spring)