在实际开发中,Service层主要负责业务模块的逻辑应用设计。在设计Service层的过程中,先设计接口,然后设计接口的实现类。通常情况下,Service层用于封装项目中一些常用的业务逻辑,这么做的好处是有利于业务逻辑的独立性和重复利用性。
7.1-Service层和@Service注解
SpringBoot的Service层是业务逻辑层,其作用是处理业务需求,封装业务方法,执行Dao层中用于访问、处理数据的操作。Service层通常由一个接口和这个接口的实现类组成。其中,Service层的接口可以在Controller层中调用,用于实现数据的传递和处理。Service层的实现必须使用@Service注解予以标注。
1,数据访问层Dao层介入Service层与数据库之间,用于访问、操作数据库中的数据。Dao层通常由Dao接口、Dao实现层和Dao工厂这3部分组成。在Dao接口中,定义了一系列用于访问、操作数据库数据的方法。在Dao的实现层,实现了Dao接口的方法。Dao工厂类的作用则是返回一个Dao实现类的对象。
2,Controller层的作用是通过调用Service层的接口,控制各个业务模块的业务流程。Controller层通过解析用户通过URL地址发送的请求,调用不同的Service层的接口处理这个请求,把处理结果返回给客户端。
在SpringBoot项目中,把被@Service注解标注的类成为服务类。@Service注解属于Component组件,可以被SpringBoot的组件扫码器扫描到,所以项目启动时,服务类的对象会自动创建,并被注册为Bean。
7.2-Service的实现
- 定义一个Service层的接口,在这个接口中定义用于传递和处理数据的方法。
- 定义一个上面创建的Service层的实现类,并使用@Service注解予以标注。这个实现类的作用有2个,一个是实现Service层的所有方法,二是在这些方法中执行Dao层的方法访问、处理数据。
- 项目启动Service类自动创建并被注册为Bean,在Controller层(或者其他的Component组件类中)注入这个Service Bean即可。
7.3-同时存在多个实现类的情况
7.3.1按照实现类的名称映射服务类的对象
使用@Service注解标注的Service层的实现类,这个类的对象被称作服务类的对象,这个对象会被自动的创建,并被注册成Bean,所以,Bean的名称就是实现类的名称,同时,实现类的名称要首字母大写,Bean的名称的首字母是小写的。
通俗来说,一个Service层的2个实现类,它们注入到SpringBoot容器中的Bean的名称是不一样的,所以SpringBoot毫无压力地分辨出controller要的实现类。
@Service
public class ServiceImpl implements Service{
//实现接口的业务方法和用于执行访问/处理数据的代码
}
@Autowired
Service serviceImpl;
上面的代码等同于下面代码:
@Autowired
@Quqlifier("serviceImpl")
Service impl;
7.3.2按照@Service的value属性映射服务类的对象
在@Service注解中,只包含一个value属性,它是@Service注解的默认属性。
在实现类的@Service的value赋值后,相当于在创建与服务类的对象对应的Bean时确定了Bean的名称。
@Service(value="id")
@Service("id")//唯一属性,所以可以省略value=字样
上述注解等同于
@Bean("id")
public Service createBean(){
return new ServiceImpl();
}
其他组件可以通过指定Bean的名称的方式来完成service的注入。
@Autowired
Service id;
针对7.3.1和7.3.2提供的2种方法,用7.3.1的更简单和方便。
7.4 不采用接口的服务类
功能太简单多写个接口实现太繁琐,直接接口和实现类合并即可,不做过多赘述。
7.5 @Service与@Repository的联系和区别
在SpringBoot中,@Repository注解可以标注任何类,被它标注过的类用于执行和数据库相关的操作,并支持自动处理在操作数据库过程中产生的异常。
同样的,@Repository与@Service都属于Component组件类。
虽然@Service注解和@Repository注解都是针对不同使用场景所采取的特定功能化的注解组件,但@Service层用于标注Service层(即业务逻辑层),@Repository注解用于标注Dao层(即数据库访问层),通过字面就能看出是业务服务还是数据库服务。
打完收工。