在使用spring注解方式注入时,遇到一些问题,求解。
举例来说。
public class Office {
private String officeNo ;
//省略 get/setter
}
public class Boss {
private Office office;
// 省略 get/setter
}
我们使用xml进行注入配置,如下
<bean id="boss" class="com.Boss">
<property name="office" ref="office" />
</bean>
<bean id="office" class="com.Office">
<property name="officeNo" value="abc"/>
</bean>
如果使用注解方式。用@Component讲Office声明为bean,用 @Autowired(或者@Resource)讲bean注入Boss类中。
@Component
public class Office {
private String officeNo ;
//省略 get/setter
}
public class Boss {
@Autowired
private Office office;
// 省略 get/setter
}
上面例子中,xml中使用<property name="officeNo" value="abc"/>对Office类的officeNo的值注入,那使用注解该怎么对officeNo值进行注入?
另外我们经常遇到的一种情况是,要注入的参数是接口类型。比如说:
public interface UserDao( ){
public void syso();
};
public class UserDaoImpl implements UserDao(){
public void syso(){
system.out.print("abc");
}
public class UserDaoImpl2 implements UserDao(){
public void syso(){
system.out.print("def");
}
};
public class Test(){
@Autowired
private UserDao ud;
public void syso{
ud.syso();
}
}
类似于这种情况,当要注入的参数是接口时,spring会根据接口选择实现类吗?如果会,那么像上例中该接口有多个实现类时该怎么办?此时可以使用@Qualifier 注解来表明bean吗?
------解决方案--------------------
上面例子中,xml中使用<property name="officeNo" value="abc"/>对Office类的officeNo的值注入,那使用注解该怎么对officeNo值进行注入?
----定义一个bean,类型为String,值为"abc",在Office里加注解,并Qualifier 这个beanID试试,这个bean定义,使用String("abc")方式的构造方法;还有一种方式,就是获取Offic的bean,然后通过setter方法修改里面officNo
类似于这种情况,当要注入的参数是接口时,spring会根据接口选择实现类吗?
----会
如果会,那么像上例中该接口有多个实现类时该怎么办?此时可以使用@Qualifier 注解来表明bean吗?
----多个实现的时候,可以通过Qualifier ;也可以通过@Resource注解(就不需要@Qualifier了),这时候需要定义属性名与对应的实现类名一致,首字母小写,就可以按名称区分取哪个实现类了。
至于什么注解失效,要看报错信息,一定有线索提示的。