面试官:Spring 中的 Service 有多个实现类,怎么注入?

Java后端技术

共 4261字,需浏览 9分钟

 · 2023-07-15

      
        

往期热门文章:

1、SpringBoot 生产中 16 条最佳实践 2、CTO 说,禁用使用 kill -9 关闭程序! 3、Spring Boot自带的工具类,太好用了! 4、现如今上海还有哪些牛B的互联网公司? 5、一个程序员的水平能差到什么程度?


方法一: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)

方法一代码如下:

接口

      
        public interface HumanService {
    public String name();
}

接口实现类

      
        @Servicepublic class TeacherServiceImpl implements HumanService {
    @Override
    public String name() {
        System.out.println("teacher");
        return "teacher";
    }
}
@Servicepublic class DoctorServiceImpl implements HumanService {
    @Override
    public String name() {
        System.out.println("doctor");
        return "doctor";
    }
}

控制器

      
        @RestController
public class HumanController {
    //    @Resource(type = DoctorServiceImpl.class) //方法二
    @Autowired
    @Qualifier("teacherServiceImpl")
    private HumanService humanService;

    @RequestMapping("/name")
    public String name(){
        return humanService.name();
    }
}


方法三代码如下:

接口

      
        public interface HumanService {
    public String name();
}

接口实现类

      
        @Service("teacherService")
public class TeacherServiceImpl implements HumanService {
    @Override
    public String name() {
        System.out.println("teacher");
        return "teacher";
    }
}
@Service("doctorService")
public class DoctorServiceImpl implements HumanService {
    @Override
    public String name() {
        System.out.println("doctor");
        return "doctor";
    }
}

控制器

      
        @RestController
public class HumanController {

    @Resource(name="doctorService")
    private HumanService humanService;

    @RequestMapping("/name")
    public String name(){
        return humanService.name();
    }
}
      


转自:cnblogs.com/zoe-java/p/11530888.html
        
            
              往期热门文章:
            
          
        

1、告别混乱代码:SpringBoot 后端接口规范 2、项目终于用上了Spring状态机,非常优雅! 3、自从用了这款 IDEA 神器,领导都夸我代码写得好! 4、MyBatis的二级缓存,慎用! 5、8种专坑同事的 SQL 写法,性能降低100倍,不来看看? 6、最近火起的 Bean Searcher 与 MyBatis Plus 到底有啥区别? 7、别再重复造轮子了,一个 Spring 注解轻松搞定循环重试功能! 8、2023最新互联网公司时长排行榜出炉! 9、弃用 Nginx 后!它成为了最受欢迎 Web 服务器。。。 10、计算机会成为下一个土木吗?

浏览 45
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报