Spring中 如果该Service有多个实现类,它怎么知道该注入哪个ServiceImpl类?

简介: 如果该Service有多个实现类,它怎么知道该注入哪个ServiceImpl类?

方法一:Controller中注入service的时候使用@Autowired自动注入,@Qualifier("beanId") 来指定注入哪一个。


方法二:Controller中注入service的时候使用@Resource(type = 类名.class)来指定注入哪一个。


方法三:


 1.每个service的impl都可以指定名称(使用@Service(“名称”))


 2.Controller中注入service的时候使用名称来指定注入哪一个(使用 @Resource(name="名称"))。 



@Service注解,其实做了两件事情:


1、声明TeacherServiceImpl .java是一个bean。因为TeacherServiceImpl .java是一个bean,其他的类才可以使用@Autowired将TeacherServiceImpl 作为一个成员变量自动注入。


2、TeacherServiceImpl .java在bean中的id是"teacherServiceImpl ",即类名且首字母小写。


注意:不能有同名的,不然要报错。



@Autowired注解的意思就是:


 当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去。



@Resource的作用相当于@Autowired。



@Autowired和@Resource两个注解的区别:


1.@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了。


2.@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配。


3.@Autowired默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false)。



方法一代码如下:


接口


publicinterfaceHumanService {
publicStringname();
}

接口实现类



@ServicepublicclassTeacherServiceImplimplementsHumanService {
@OverridepublicStringname() {
System.out.println("teacher");
return"teacher";
    }
}
@ServicepublicclassDoctorServiceImplimplementsHumanService {
@OverridepublicStringname() {
System.out.println("doctor");
return"doctor";
    }
}

控制器


@RestControllerpublicclassHumanController {
//    @Resource(type = DoctorServiceImpl.class) //方法二@Autowired@Qualifier("teacherServiceImpl")
privateHumanServicehumanService;
@RequestMapping("/name")
publicStringname(){
returnhumanService.name();
    }
}


方法三代码如下:


接口


publicinterfaceHumanService {
publicStringname();
}


接口实现类


@Service("teacherService")
publicclassTeacherServiceImplimplementsHumanService {
@OverridepublicStringname() {
System.out.println("teacher");
return"teacher";
    }
}
@Service("doctorService")
publicclassDoctorServiceImplimplementsHumanService {
@OverridepublicStringname() {
System.out.println("doctor");
return"doctor";
    }
}


控制器


@RestControllerpublicclassHumanController {
@Resource(name="doctorService")
privateHumanServicehumanService;
@RequestMapping("/name")
publicStringname(){
returnhumanService.name();
    }
}


相关文章
|
1月前
|
XML 存储 Java
Spring重要类解析
Spring重要类解析
21 0
|
1月前
|
XML Java 开发者
Spring Boot中的bean注入方式和原理
Spring Boot中的bean注入方式和原理
80 0
|
5天前
|
Java Spring 容器
Spring注入
Spring注入
24 13
|
17天前
|
JSON Java 数据库连接
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
27 1
|
1月前
ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
12 0
|
1月前
|
Java Spring
使用JDBCTemplate实现与Spring结合,方法公用 ——Emp实现类(EmpDaoImpl)
使用JDBCTemplate实现与Spring结合,方法公用 ——Emp实现类(EmpDaoImpl)
8 0
|
1月前
|
Java Spring
使用JDBCTemplate实现与Spring结合,方法公用 ——共用实现类(BaseImpl)
使用JDBCTemplate实现与Spring结合,方法公用 ——共用实现类(BaseImpl)
10 1
|
1月前
|
缓存 前端开发 Java
【Spring底层原理高级进阶】轻松掌握 Spring MVC 的拦截器机制:深入理解 HandlerInterceptor 接口和其实现类的用法
【Spring底层原理高级进阶】轻松掌握 Spring MVC 的拦截器机制:深入理解 HandlerInterceptor 接口和其实现类的用法
|
XML 前端开发 Java
Spring 最常用的 7 大类注解,史上最强整理!
随着技术的更新迭代,Java5.0开始支持注解。而作为java中的领军框架spring,自从更新了2.5版本之后也开始慢慢舍弃xml配置,更多使用注解来控制spring框架。
|
1月前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
46 0