**
1.接口:IUserService
public interface IUserService {
public void sayHello();
}
2.实现类:UserServiceImpl,实现了UserService接口
@Service("UserServiceImpl ")
public class UserServiceImpl implements IUserService{
// 添加属性:
private String name;
@Override
public void sayHello() {
System.out.println("Hello Spring: " + name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、业务类:Controller
public class Controller {
@Autowired
private IUserService iUserService;
......
}
假如有一个接口 IUserService, UserServiceImpl类实现了接口 UserServiceImpl, 且该接口只有 UserServiceImpl这一个实现类,那么在引用实现类的时候,我们使用的是实现类的接口(像上面程序展示的那样)。Spring会按 byType的方式寻找接口的实现类,将其注入。
假如有另一个实现类 UserServiceImpl2 也实现了接口 IUserService, 这时候再按上面的方式去引用, 在同时存在两个实现类的情况下,会报错。
因为@Autowired 的注入方式是 byType 注入, 当要注入的类型在容器中存在多个时,Spring是不知道要引入哪个实现类的,所以会报错。
可以通过 byName 注入的方式。可以使用 @Resource 或 @Qualifier 注解
@Resource 默认是按照 byName 的方式注入的, 如果通过 byName 的方式匹配不到,再按 byType 的方式去匹配。所以上面的引用可以替换为:
public class Controller {
@Resource(name="UserServiceImpl")
private IUserService iUserService;
......
}
@Qualifier 注解也是 byName的方式,但是与@Resource 有区别,@Qualifier 使用的是 类名。
public class Controller {
@Qualifier("UserServiceImpl")
private IUserService iUserService;
......
}
spring 到底注入接口还是实现类?
<bean id="userService" class="com.lby.demo1.UserServiceImpl">
<property name="name" value="李四"/>
</bean>
可以看到,在 applicationContext.xml 里bean id为接口名,但是实际的类却是实现类,我们在注入时
// 创建Spring的工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 通过工厂获得类:
// 下面相当于UserService userService = new UserServiceImpl();
UserService userService = (UserService) applicationContext.getBean("userService");
实际上getBean会返回一个父类object,然后我们再强转为子类接口 UserService
在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行
接口的实现关系同理,接口相当于接口的实现类
如上面所说,@autowired自动寻找 applicationContext.xml 里 该接口的实现类,而@Resource根据bean id 注入在赋值给注释下的接口
@autowired和@Resourc相当于 UserService userService = (UserService) applicationContext.getBean(“userService”);
————————————————
版权声明:本文为CSDN博主「奥兰治的威廉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/q503385724/article/details/87349369