例如以下类:
teanDao是没有new的,所以直接用的时候会报空指针异常,所以再Spring自动创建该Service的时候要给teamDao注入,也就是赋值吧。
因为TeamDao这个对象是要用的,所以这个对象也是要创建的,但是要在创建TeamService的时候将该Service中的teamDao赋值让其使用。
除了通过构造方法注入属性值外,都需要service中有对应的set函数,来给对应的teamDao添加属性值。
java
public class TeamService {
private TeamDao teamDao;
public TeamService() {
}
public TeamService(TeamDao teamDao) {
this.teamDao = teamDao;
}
public void setTeamDao(TeamDao teamDao) {
System.out.println("TeamService set teamDao" );
this.teamDao = teamDao;
}
public void add() {
teamDao.add();
System.out.println("TeamService0---add");
}
}
1、通过set方法
通过property标签可以将teamDao注入到service中的变量名为name值的变量,注入的就是ref对应的beanid。
前提是TeamService中set方法。
<bean id="teamDao" class="com.AE.dao.TeamDao"></bean>
<bean id="teamService" class="com.AE.service.TeamService" >
<!-- 1、使用set方法注入属性值 -->
<property name="teamDao" ref="teamDao"></property>
</bean>
2、通过构造方法
跟上一个是差不多的,只是实现方式不一样而已。
<bean id="teamDao" class="com.AE.dao.TeamDao"></bean>
<bean id="teamService1" class="com.AE.service.TeamService" >
<!-- 2、使用构造方法注入属性值 -->
<constructor-arg name="teamDao" ref="teamDao"></constructor-arg>
</bean>
3、自动注入
通过autowire属性进行设置。
前提是TeamService中set方法。
3.1、byName
就比如该service中定义使用的类名是teamDao,就会查找Spring创建的类中id对应的,就是根据定义名进行查找。
<bean id="teamDao" class="com.AE.dao.TeamDao"></bean>
<bean id="teamService2" class="com.AE.service.TeamService" autowire="byName">
<!-- 3.1、按名称自动注入 -->
</bean>
3.2、byType
跟byName差不多,区别是根据类型去查找的,即使创建对象的时候不是对应的teamDao,也可以使用,问题就是假如XML中有同时创建了两个类都是TeamDao,这时候通过类型去查找就会报错,因为有两个,spring不知道用哪个。
<bean id="teamDao" class="com.AE.dao.TeamDao"></bean>
<bean id="teamService3" class="com.AE.service.TeamService" autowire="byType">
<!-- 3.2、按类型自动注入 -->
</bean>