文章目录
-
- [@Autowrite 和 @Resource](#@Autowrite 和 @Resource)
- [@Qualifier 和 @Primary](#@Qualifier 和 @Primary)
- @PathVariable
- [@Controller、@Service、@Repository 和 @Component](#@Controller、@Service、@Repository 和 @Component)
@Autowrite 和 @Resource
我们先讲讲
@Autowrite
注解 吧。
public class StudentService3 implements IStudentService {
//@Autowired
private IStudentDao studentDao;
private String id;
public void setId(String id) {
this.id = id;
}
配置之后,Spring 会在容器中(这个注解是Spring的),先去寻找
IStudentDao
这个类型的 Bean,如果有 ,则会去匹配。也就是所谓的 "按照类型分配" 。但是 如果没有的情况下,则会 去容器中 找 相同名称(studentDao)的 Bean 。如果有,则会选择后者这种情况。也就是所谓的 "按照名称分配" 。
总结一下:@Autowrite
会优先 去寻找 相同类型的 bean ,其次再去找 相同 名称的bean。
接下来,我们再聊聊@Resource
这个注解。
这个注解可不是 Spring 的哦,@Resource
这个注解 是 JDK 内置的注解。刚好跟上面注解 的某种含义在 用法上相反。看下面的总结基本上就能很清晰的明白了。
总结一下:@Resource
会优先 去寻找 相同名称 的 bean ,其次再去找 相同 类型的bean。
以上就是 @Autowrite 和 @Resource 的区别
@Qualifier 和 @Primary
废话不多说 , 先上例子。
@Component("fooFormatter")
public class FooFormatter implements Formatter {
public String format() {
return "foo";
}
}
@Component("barFormatter")
public class BarFormatter implements Formatter {
public String format() {
return "bar";
}
}
@Component
public class FooService {
@Autowired
private Formatter formatter;
//todo
}
此时此刻,我们假如用
@Autowrite
的话,没有指定其他限制条件,肯定难以注入呀。它们的类型都相同。会报异常。
借用 AI 一句话:.
如果使用
@Autowired
注解,并且没有提供其他限定条件(如@Qualifier
注解),Spring将会因为无法确定应该注入哪一个bean而抛出异常。如果使用了 @Qualifier 注解来指定哪一个bean应该被注入,那么Spring将会注入指定的bean。
此时此刻,应该明白了@Qualifier
这个注解的含义了吧。嘿嘿。
那@Parmary
呢?
我用一句话解释一下:@Parmary
定义的是默认值,而@Qualifier
指的非常彻底。就比如说,我就要你!优先值很高。而@Parmary
所说的是,我默认是你,优先值相对来说,比较低。
所以,明白了嘛 ~~ 。
@PathVariable
废话不多说,直接上代码。
@RequestMapping("/getUserById/{name}")
public User getUser(@PathVariable("name") String name){
return userService.selectUser(name);
}
这个注解是用来传递参数的,虽然有简写,但是不推荐,简写在此处就先略过。
@Controller、@Service、@Repository 和 @Component
@Component
是一个总体,分别区分了以下这个三层架构。.
三层架构分别是:
控制层(
@Controller
) ⇒ 控制层,用来处理用户传递过来的请求等。服务层(
@Service
) ⇒ 业务逻辑处理层,用来处理 业务逻辑 的层面、和
持久层(
@Repository
) ⇒ 数据访问层,用来标注(不是处理!)数据访问组件,例如 Dao 组件以及实现类 等。主要用于(标注)数据库。