我想静态代理新增一个类,我跟一个学习视频做。他在代理类中的@Component中加入了“userService”,因为控制层中的@Autowired会先去找这个名字,找不到userService名字,才会去找类型。
所以我也这样做去添加这个userService,但是我还是会根据类型找,也就是进入到userServiceImpl层中。后面我就在代理类中的@Component中变了一下,把值变成“userService1”,控制层的也变成userService1,这个时候才开始从名字开始找。这里我十分不解,还请各位未来java天花板指定一下
-------------------------------------- 这里我开始改变value值了--------------------------------------
@Component
public class UserService {
// ...
}
@Component
public class MyProxy {
@Autowired
private UserService userService;
// ...
}
@Controller
public class MyController {
@Autowired
private UserService userService;
@Autowired
private MyProxy myProxy;
// ...
}
在上面的代码中,MyProxy类中的@Autowired注解会自动注入userService实例,而MyController中的@Autowired注解则会自动注入userService和myProxy实例。因为控制层中的@Autowired会先去找名字,所以如果你想指定注入的实例名称,可以使用@Qualifier注解。例如:
@Component("myUserService")
public class UserService {
// ...
}
@Component
public class MyProxy {
@Autowired
@Qualifier("myUserService")
private UserService userService;
// ...
}
@Controller
public class MyController {
@Autowired
@Qualifier("myUserService")
private UserService userService;
@Autowired
private MyProxy myProxy;
// ...
}
这样就可以明确指定注入的实例名称了。希望这个回答能够帮到你。
@Component注解是将类对象注入Context容器中,你给它设置value值就是给它定义名称,没有value就是类名首字母小写,详细看这个吧http://t.csdn.cn/Fjs9I
@Autowired 是根据类型查找,另外,做对照实验最重要的是保证变量唯一。对于第二种情况,你就算把变量改成private UserService user
都能成功,因为跟变量名没一点关系。
看了下回答,基本是没跟着debug走过,
第一步,查找待选bean是根据type去筛选的,所以符合类型的bean会丢到一个map中