spring框架
**
依赖注入方式
**
开门见山,这篇博客详细讲一讲这个依赖注入的方式,Let 's go

依赖注入嘛,前面博客已经介绍了,这里就不多说了,嘿喂够

说依赖注入前,我们先想一想不用容器前,我们是如何对一个对象赋值的???
set方法 有参构造 接口…
那么,我们的spring容器依赖注入也将采用set方法和有参构造这两种方式进行。
还有一点,DI依赖注入的方式:1、配置 2、注解
以下所做皆在控制反转步骤的基础之上。没有看控制反转步骤的戳这里<—
配置:
1、有参构造
<bean id="boss3" class="Boss">
<constructor-arg name="name" value="zs"/>
</bean>
//在bean标签内使用constructor-arg对有参构造参数赋值
//name为参数名 value为你给定的参数值
//引用类型的参数后面介绍
2、set方法
<bean id="boss4" class="Boss">
<property name="name" value="ls"/>
</bean>
//在bean标签内使用property对set方法传参赋值
//同理name为参数名 value为你给定的参数值
3、引用类型注入
既然我们能给当前对象赋值,那么引用类型我们就先给赋值一次,赋值之后,我们将bean标签下的id拿过来给我们的引用类型作为值传进去。
//Car为一个类,Boss类里有这么Car的对象
<bean id="car" class="Car">
<property name="color" value="red"/>
<property name="type" value="BMW"/>
</bean>
<bean id="boss5" class="Boss">
<property name="name" value="ls"/>
<property name="car" ref="car"/>
</bean>
//我们使用ref对引用数据类型传参,参数为bean标签的id

那么,需要注意的是:
使用有参构造,那么实体类里就要有有参构造方法;set方法同理。要不然,spring找不到则会抛出异常!!!
同样应对数组类型和List类型,我们的property标签内有array、list、map…标签
注解:
注解首先需要导个包:
commons-logging
接下来的事情是重新建一个xml文件(我叫它spring-config-Annotation.xml),把之前创建的文件的头部beans复制过来
//加上这两行<beans xsi:schemaLocation="...这里"></beans>
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
然后在beans标签内打开扫描
//base-package表示扫描的位置(相对于Sources Root的路径)
//我的是扫描com下的全部注解
<context:component-scan base-package="com"/>
接下来该写注解了…
1.@Component注解写到实体类前
@Component(value = “boss”)
public class Boss{}
使用getBean(“boss”)
得到Boss类对象
2.@Value(参数)进行普通类型赋值
@Value(“zs”)
public String name;
3.@Autowired 或 @Resource进行(引用类型)赋值
@Autowired是自动装配,自动找到对应的对象类进行赋值,但遇到多个对象时,便无法进行区分
@Resource(name=“参数”)是根据name的参数寻找对象进行赋值
来看一看具体用法:
//这个老板开了一辆黄色的兰博基尼(A Rich man)
@Component(value = "car")
public class Car{
@Value("Lamborghini")
private String model;
@Value("yellow")
private String color;
}

这车真帅
接下来分别是两种注解的使用
@Component(value = "boss")
public class Boss {
@Value("zs")
public String name;
@Autowired
public Car car;
}
@Component(value = "boss")
public class Boss {
@Value("zs")
public String name;
@Resource(name="car")
public Car car;
}
既然说@Autowired不能识别同类型的对象
那么怎么才能和@Resource一样可以识别呢???
@Autowired
@Qualifier("car")
public Car car;
@Resource(name="car")
public Car car;
加一个@Qualifier便可以做到和@Resource相同了。
注意:
使用注解这种方式,我们便不再需要那些乱七八糟的构造方法和get/set方法。删掉它们即可(不删也无所谓)
那么,依赖注入的两种方式也就到此结束

返回 》
控制反转步骤
回到 》
控制反转与依赖注入