1. @Component,@Repository,@Controller,@Service
@Repository,@Controller,@Service这三个作用大致相同,都是把对象交给spring管理,在spring中创建实例,至于区别,@Service写在业务层,@Controller写在Controller层,@Repository写在持久层.这三个注解可以说是@Component注解的语义细分,分别在不同场景使用,因此你会看到在持久层写@Repository或者@Component都是可以的,如下:
//@Component
@Repository//两个注解选其一,均正确
public interface ClassMapper {
/**
* 查询所有班级信息
* @return
*/
List<Class> selectAllClass();
}
2. @Mapper
@Mapper
@Repository
public interface ClassMapper {
/**
* 查询所有班级信息
* @return
*/
List<Class> selectAllClass();
}
以上是持久层的一段代码,你可能会有疑问,@Repository(@Component)实现的是自动装配,那么@Mapper是干嘛的呢?这里要说明一点,@Mapper是Mybatis的注解,和 Spring 没有关系,@Repository (@Component)是 Spring 的注解,用于声明 Bean。@Mapper有将dao接口和mapper.xml配置文件建立映射的作用,因此,@Mapper 一定要有,否则Mybatis 找不到 mapper,@Repository 可有可无,可以消去依赖注入的报错信息。
@Mapper//只写@Mapper是可以运行的
public interface ClassMapper {
/**
* 查询所有班级信息
* @return
*/
List<Class> selectAllClass();
}
此外,@MapperScan 可以替代 @Mapper。
3. 注解写在接口层,还是实现类?
先说结论,持久层只有接口,注解写在接口上即可,而业务层的注解写在实现类,@Service注解是标注在实现类上的,因为@Service是把spring容器中的bean进行实例化,也就是等同于new操作,只有实现类是可以进行new实例化的,而接口则不能,所以是加在实现类上的。
4. @AutoWired,@Resource
@AutoWrite by Type在spring中bean并自动装配,即在spring容器中按类型匹配(必须是存在的,即实例化过的,否则会报空指针异常,如果要允许null值,可以设置它的required属性为false),@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。
@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
@Autowired
TeacherService teacherService;//创建service实体
@Autowired
private Student student;//创建对象实体