spring注⼊接⼝还是实现类,同⼀接⼝有多个实现类,如何注
⼊
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>
可以看到,在 l ⾥bean id为接⼝名,但是实际的类却是实现类,我们在注⼊时
// 创建Spring的⼯⼚
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("l");
resource和autowired注解的区别// 通过⼯⼚获得类:
// 下⾯相当于UserService userService = new UserServiceImpl();
UserService userService = (UserService) Bean("userService");
实际上getBean会返回⼀个⽗类object,然后我们再强转为⼦类接⼝ UserService
在继承关系中,如果⼀个实例的数据类型是某个⼦类,那它的数据类型也可以被看做是⽗类。但是,反过来就不⾏
接⼝的实现关系同理,接⼝相当于接⼝的实现类
如上⾯所说,@autowired⾃动寻 l ⾥ 该接⼝的实现类,⽽@Resource根据bean id 注⼊在赋值给注释下的接⼝
@autowired和@Resourc相当于 UserService userService = (UserService) Bean("userService");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论