@Component
//等同于
<bean id="userController" class="com.xszx.controller.UserController"></bean>
//如果需要指定名称,则使用@Component(value="aaa")
@Controller
用于Controller层,便于区分代码,提高代码的可读性,作用和@Component相同
@Service
用于Service层,便于区分代码,提高代码的可读性,作用和@Component相同
@Repository
用于Dao层,便于区分代码,提高代码的可读性,作用和@Component相同
@Autowired
//set方法上标注注解
//默认是按照byType方式注入,当有多个实现时,则通过byName注入
//如果需要指定名称注入,追加@Qualifier(value = "bbb")
@Qualifier(value = "bbb")
为set方法注解起别名,如果使用了,对应的@Component(value="bbb")的value值要相同
@Resource
//set方法上标注注解
//默认是按照byName方式注入,如果没有匹配则通过byType注入
//如果需要指定名称注入,追加@Qualifier(value = "bbb")
@Resource还有两个重要的属性:name和type,用来显式指定byName和byType方式注入
对应4种情况:
// 1. 默认方式:byName
@Resource
private UserService userDao;
// 2. 指定byName
@Resource(name="userService")
private UserService userService;
// 3. 指定byType
@Resource(type=UserService.class)
private UserService userService;
// 4. 指定byName和byType
@Resource(name="userService",type=UserService.class)
private UserService userService;
既没指定name属性,也没指定type属性:默认通过byName方式注入,如果byName匹配失败,则使用byType方式注入(也就是上面的那个例子)
指定name属性:通过byName方式注入,把变量名和IOC容器中的id去匹配,匹配失败则报错
指定type属性:通过byType方式注入,在IOC容器中匹配对应的类型,如果匹配不到或者匹配到多个则报错
同时指定name属性和type属性:在IOC容器中匹配,名字和类型同时匹配则成功,否则失败