1. @Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理
2. @Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能,当你的一个类被@Component所注解,那么就意味着同样可以用@Repository, @Service, @Controller来替代它,同时这些注解会具备有更多的功能,而且功能各异。
3. @Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
4. @Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
5. @Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。
Component.class
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
String value() default "";
}
Repository.class
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
Controller和Service的源码同样拥有Component的所有实现
{ @AliasFor(
annotation = Component.class
)}
简单实现@Repository注解的案例:
数据库dao
@Repository
public class ClassInfoDao implements ClassInfoImpl {
@Autowired
JdbcTemplate jdbcTemplate;
@Override
public List<Map<String, Object>> getClasses() {
List<Map<String, Object>> list = new ArrayList<>();
String sql = "select * from exmaple_classes";
List<Map<String, Object>> l = jdbcTemplate.queryForList(sql);
if (l != null && l.size() > 0) {
list.addAll(l);
}
return list;
}
}
前端请求接口实现
@RestController
@RequestMapping("/test")
public class TestRestController {
@Autowired
ClassInfoDao classInfoBean;
@PostMapping("/classes")
public Map userInfo(@RequestBody PostUserBean postUserBean){
Map map = new HashMap() ;
if (postUserBean == null || postUserBean.getName() == null ||!postUserBean.getName().equals("邱工")){
map.put("msg","请传入{“Name:邱工”}");
} else {
map.put("classInfo",classInfoBean.getClasses());
// if (postUserBean.getClsName() != null&& postUserBean.getClsName().length() != 0 ){
// map.put("selectById",classInfoBean.selectById(postUserBean.getClsName()));
// }
}
return map ;
}
}
请求结果:
Spring 注解 @Autowired 和@Resource 的区别
1、@Autowired和@Resource都可以用来装配bean,都可以写在字段上,或者方法上。
2、@Autowired属于Spring的;@Resource为JSR-250标准的注释,属于J2EE的。
3、@Autowired默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如:@Autowired(required=false),如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
@Autowired()
@Qualifier("baseDao")
private BaseDao baseDao;
4、@Resource,默认安装名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
@Resource(name="baseDao")
private BaseDao baseDao;
文章来源:@Component, @Repository, @Service的区别+@Autowired 和@Resource 的区别