依赖注入的类型
- 构造器注入(constructor injection)传入继承同一接口的不同类
- Setter注入
- 其他注入
依赖注入的方法
- 自动配置
- Java配置
- XML配置
1、自动配置
()中为可选参数
* @Configuration 配置注解 说明是配置类
* @Component //(“id”)设置ID 组件注解,自动扫描时会扫描到这个类
* @ComponentScan //设置扫描的包(“package name”) 组件扫描
- @AutoWired //添加(required=false)没有匹配bean时不报错 自动DI(依赖注入)
可在构造函数处构造器注入,也可以在setter处注入
也等同于@Inject
2、Java配置DI
@Bean(name="xxx")//指定一个bean的id
public 类实现的接口名 类名(){//类名第一个字母小写
return new 类对象();
//若有依赖可以(依赖的接口或new 接口()但不推荐)bean一般都是单例的
return new 类对象(依赖接口);
}
//也可以用setter
@Bean(name="xxx")//指定一个bean的id
public 类实现的接口名 类名(){//类名第一个字母小写
类 ref = new 类(依赖对象);
ref.setter(依赖对象);
return ref;
}
3、XML配置DI
构造器注入
<beans xnlns="http://ww.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context">
<bean id="cdPlayer" class="soundsystem.CDPlayer">
<!--构造器注入引用-->
<constructor-arg ref="compactDisc" />
<!--为构造函数赋字面量-->
<constructor-arg value="xxx">
<constructor-arg value="xxx">
</bean>
<!--constructor-arg比c空间能额外做到的是可以为参数装填列表等容器,
从而做到了批量装填,且带有预先value或装填引用-->
<constructor-arg>
<list>
<value>xxx</value>
<value>xxx</value>
</list>
<list>
<ref bean="xxx"/>
<ref bean="xxx"/>
</list>
</constructor-arg>
</beans>
<beans xnlns="http://ww.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://www.springframework.org/schma/c"
xsi:schemaLocation="http://springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context">
<!-- configuration cetains no here -->
<!--构造器注入也可以用c命名空间,但是要引入以下这个xsd-->
<!--xmlns:c="http://www.springframework.org/schma/c"-->
<!--用法-->
<!--c:_参数名="xxx"为构造函数赋字面量 假如只有一个参数可以直接_占位,和ref一样-->
<!--c是命名空间
cd是指构造器参数名,也可以用位置代替比如0,或者根本用_表示
-ref是注入bean引用-->
<bean id="cdPlayer" class="soundsystem.CDPlayer" c:cd-ref="compactDisc"
c:_参数名="xxx"/>
</beans>
<beans />是根元素
网址是xsd文件,其中包括了beans的XML元素
Setter注入
<!--XML的Setter注入方法,为name为xxx的属性注入类为xxx的对象-->
<bean id="xxxx" class="xxx">
<property name="xxx" ref="xxx">
<!--同样也可以装填列表等容器-->
<property name="xxx">
<list>
<value>xxx</value>
<value>xxx</value>
</list>
</property>
</bean>
<!--或者用p命名空间也可以做到同样效果-->
<bean id="xxxx"
class="xxx"
p:xxx-ref="xxx"
/>
<!--p空间也可以装填字面量,但也不能批量装填,但可以引入Spring util-->
<!--引入util的xsd后,可以用<util:list>>
Spring Tool Suite可以快捷方便创建Spring XML,用来装配bean最基本的XML元素包含在spring-beans模式之中。
在Java配置中引用其他
//引入Java配置中的Bean
使用@Import
注解引入其他配置类进行依赖注入
@Import(xxxxConfig.class)
//引入XML的Bean
@ImportResource(xxx.xml)
在XML配置中引用其他
<!--将Java配置类作为一个bean引入-->
<bean class="xxxConfig" />
<!--引入其他XML-->
<import resource="xxx.xml">
总结
《Spring In Action》中较为推荐自动配置 > Java > XML,在实际中都采用三者混合,减少显示配置也可以降低代码复杂度
《Spring In Action》第二章