(三)基于XML的DI
举例:项目di
1、注入分类
Bean实例在调用无参构造器创建了空值对象后,就要对Bean的属性进行初始化。初始化是由容器自动完成的,称为注入。根据注入方式的不同,常用的由有两类:设值注入、构造注入。
还有另外一种,实现特定接口注入。由于这种方式采用侵入式编程,污染了代码,所以几乎不用。
(1)设值注入
设值注入是指,通过setter方法传入被调用者的实例。这种注入方式简单、直观,因而Spring的依赖注入中大量使用。
举例:di01_1包



当指定bean的某属性值为另一bean的实例时,通过ref指定它们间的引用关系。ref的值必须为某bean的id值。


对于其它Bean对象的引用,除了<bean/>标签的ref属性外,还可以使用<ref/>标签。

(2)构造注入
构造注入是指,在构造者调用者实例的同时,完成被调用者的实例化。即使用构造器设置依赖关系。
举例:di01——2包


<constructor-arg/>标签中用于指定参数的属性有:
- name:指定参数名称
- index:指明该参数对应着构造器的第几个参数,从0开始。不过,该属性不要不行,但要注意,若参数类型相同,或之间有包含关系,则需要保证赋值顺序要与构造器中的参数顺序一致。
另外,type属性可用于指定其类型。基本类型直接写类型关键字即可,非基本类型需要写全限定性类名。
2、命名空间注入(了解)
3、集合属性注入
举例:di03包

(1)为数组注入值

(2)为List注入值

(3)为Set注入值
(4)为Map注入值

(5)为Properties注入值

4、对于域属性的自动注入
对于域属性的注入,也可不在配置文件中显示注入。可以通过为<bean/>标签设置autowire属性值,为域属性进行隐式自动注入。根据自动注入判断标准的不同,可以分为两种:
byName:根据名称自动注入
byType:根据类型自动注入
(1)byName方式自动注入
当配置文件中被调用者Bean的id值与代码中调用者Bean类的属性名相同时,可使用byName方式,让容器自动将被调用者Bean注入给调用者Bean。容器是通过调用者的Bean类的属性名与配置文件的被调用者bean的id进行比较而实现自动注入的。
举例:di04——1包




(2)byType方式自动注入
使用byType方式自动注入,要求:配置文件中被调用者bean的class属性指定的类,要么代码中调用者Bean类的某域属性类型同源。即要么相同,要么is-a关系(子类,或是实现类)。但这样的同源的被调用bean只能有一个。多于一个,容器就不知道该匹配哪一个了。
举例:di04_2包

5、使用SPEL注入
SPEL,即Spring EL表达式语言。即在Spring配置文件中为Bean的属性注入值时,可直接使用SPEL表达式计算的结果。SPEL表达式以#开头,后根一对大括号。
举例:di05包




其它用法:
(1) <property name=“school” value=“#{mySchool}”/>
引用另一个bean。指定school的值为另一个Bean实例mySchool。
6、使用内部Bean注入 若不希望代码直接访问某个bean,即,在代码中通过getBean方法获取该Bean实例, 则可将该Bean的定义放入调用者bean定义的内部。 举例:di06包
7、使用同类抽象Bean注入
当若干Bean实例同属一个类,且这些实例的属性值又有相同值时,可以使用抽象Bean,以简化配置文件。
抽象Bean是用于让其他bean继承的。这个bean在Bean类中是不能通过getBean方法获取的。设置abstract属性为true来指明该bean为抽象bean,默认值为false。不过,该bean不为抽象bean时,也可被继承。只不过,在应用中,用于被继承的bean一般为抽象bean。
举例:di07包



8、使用异类抽象Bean注入
当若干不同的类对象具有相同的属性,且其值也相同时,可使用异类抽象Bean。
举例:di08包




9、为应用指定多个Spring配置文件
在实际应用里,随着应用规模的增加,系统中Bean数量也大量增加,导致配置文件变得非常庞大、臃肿。为了避免这种情况得产生,提高配置文件得可读性与可维护性,可以将Spring配置文件分解成多个配置文件。
(1)以配置文件数组方式实现
将所有配置文件的路径定义为一个String数组,并将其作为容器初始化参数出现。其将与可变参的容器构造器匹配。

各配置文件间为并列关系,不分主次。
举例:di09_01


(2)以父子配置文件方式实现
各配置文件中有一个总文件,总配置文件将各其它子文件通过<import/>引入。在Java代码中只需要使用总配置文件对容器进行初始化即可。
举例:di09_02


五、基于注解得DI
举例:di-annotation项目
对于DI使用注解,将不再需要在Spring配置文件中声明Bean实例。Spring中使用注解,需要在原有Spring运行环境基础上再做一些改变,完成以下三个步骤。
(1)导入AOP得jar包。因为注解得后台实现用到了AOP编程。

(2)需要更换配置文件头,即添加相应得约束。
(3)需要在Spring配置文件中配置组件扫描器,用于在指定得基本包中扫描注解。

1、定义Bean@Component
需要在类上使用注解@Component,该注解得value属性用于指定该bean得id值。
举例:di01

另外,Spring还提供了3个功能基本和@Component等效得注解:
- @Repository 用于对DAO实现类进行注解
- @Service 用于对Service是实现进行注解
- @Controller 用于对Controller实现类进行注解
之所以创建这三个功能与@Componenet等效得注解,是为了以后对其进行功能上得扩展,使它们不在等效。
2、Bean得作用域@Scope
需要在类上使用注解@Scope,其value属性用于指定作用域。默认为sigleton。
举例:di01

3、基本类型属性注入@Value
需要在属性上使用注解@Value,该注解得value属性用于指定要注入得值。
使用该注解完成属性注入时,类中无需setter。当然无需setter。当然,若属性有setter,则也可将其加到setter上。
举例:di01

4、按类型注入域属性@Autowired
需要在域属性上使用注解@Autowired,该注解默认使用按类型自动装配Bean的方式。
使用该注解完成属性注入时,类中无需setter。当然,若属性有setter,则也可将其加到setter上。
举例:di02


5、按名称注入域属性@Autowired与@Qualifier
需要在域属性上联合使用@Autowired与@Qualifier。@Autowired的value属性用于指定要匹配的Bean的id值。同样类中无需setter,也可加到setter上。
举例:di03

@Autowired还有一个属性required,默认值为true,表示当匹配失败后,会终止程序运行。若将其值设置为false,则匹配失败,将被忽略,未匹配的属性值为null。

6、域属性注解@Resource
Spring提供对规范中定义@Resource标准注解的支持。@Resource注解即可以按名称匹配Bean,也可以按类型匹配Bean。使用该注解,要求JDK必须是6及以上版本。
(1)按类型注入域属性
@Resource注解若不带任何参数,则会按照类型进行Bean的匹配注入。
举例:di04

(2)按名称注入域属性
@Resource注解指定其name属性,则name的值即为按照名称进行匹配的Bean的id。
举例:di05

7、Bean的生命始末@PostConstruct与@PreDestory
在方法上使用@PostConstructuct,与原来的init-method等效。在方法上使用@PreDestory,与destory-method等效。
举例:di05

8、使用JavaConfig进行配置(了解)
JavaConfig,是在Spring3开始从一个独立的项目并入到Spring中的。
9、使用juit4测试Spring(了解)
10、注解与XML共同使用

浙公网安备 33010602011771号