spring boot(统一响应结果、分层架构、ioc容器)-下

**设置响应数据**
@ResponseBody可以作用在controller方法上也可以是类上
如果在类上加了@ResponseBody注解就代表当前类下所有的方法返回值都会作为响应数据
如果是对象或者集合,它会先自动转json然后再来响应
@RestController = @Controller + @ResponseBody ;

统一响应结果
Result (code、msg、data)

首先、引入dom4j用于解析xml文件,配置dom4j依赖坐标。
其次,需要引入工具类以及实体类。一般放在文件夹com.ithm.utils专放工具类放入XmlParseUtil.java
也只有一个方法parse方法。解析resource下的xml文件创建一个对应的类,
获取列表,首先加载解析,创建一个字符串获取解析文件的路径,动态路径
```
这叫数据访问
//1加载并解析emp.xm1
String file = this.getClass ().getClassloader().getResource( name: "emp.xml") .getFile();
System.out.println(file);
List<Emp> empList = XmlParserUtils,parse(file,Emp.class);
```
对数据进行转换,性别12转换为男女
```
这叫逻辑处理
//2.对数据进行转换处理 - gender,job

empList.stream().forEach(emp -> {
    //处理 gender1:男,2:女
    String gender = emp.getGender();
    if("1".equals(gender)){
        emp.setGender("男");
      }else if("2".equals (gender)){
         emp.setGender("女") ;
}
```
```
这叫接受请求响应数据
  //3. 响应数据
  Resultreturnsuccess(empList);
```

**分层解耦**
**关于三层架构**
controller: 控制层,接收前端发送的请求,对请求进行处理,并响应数据
service:业务逻辑层,处理具体的业务逻辑。
dao: 数据访问层(Data Access obiect)(持久层),负责数据访问操作,包括数据的增、删、改、查  

dao放对数据操作的接口empdao    创建dao.impl.empdaoA存放实现类令它实现接口并且实现其中的方法 
service操作方式和dao基本相同的也是先创建接口empservice,然后定义方法获取员工列表,在impl创建类empserviceA 来实现接口,同样定义方法
只不过dao就是访问数据,service就是逻辑处理,service中创建dao对象,再调用listemp方法拿到返回的数据

controller听顾客需求,service给顾客东西,听到消息。dao计算价钱,装袋,从货架拿东西
下面的三段代码倒着看合适。写法用到了多态。类实现接口,来实现方法。调用的时候,创建接口但new的是类[1]

```
@RestController
public class EmpController {
  private EmpService empService = new EmpServiceA();
  @RequestMapping(Ov"/listEmp")
  public Result list(){
    //1. 调用service, 获取数据
    List<Emp> empList = empService.listEmp()
    //2. 组装数据并返回
    return Result.success(empList);

```

```
public class EmpServiceA implements EmpService{
  private EmpDao empDao = new EmpDaoA();
  public List<Emp> listEmp(){ 
       //1.调用dao层,获取数据
       List<Emp> empList = empDao.listEmp();
       //2.对员工信息中的gender.job字段进行处理
       empList.stream.forEach(emp -> {
        //gender :1男,2 女
       String gender = emp.getGender();
       if("1".equals(gender)){
            emp.setGender("男");
       }else if("2".equals(gender)){
            emp.setGender("女") ;
       });
       //3。 返回处理结奥
       return empList;
}  
service层

```

```
public class EmpDaoA implements EmpDao{
  public List<Emp> listEmp(){
    //加载 emp.xml,并解析 emp.xml 中的数据
    String file = this.getClass().getClassLoader().getResource(name: "emp.xml").getFile();
    List<Emp> empList = XmlParserUtils.parse(file,Emp.class)
    return empList;
```

复盘dao层访问数据,dao类方法返回获取数据集合。service类层逻辑处理.故先创建dao对象,方法对dao数据集合进行业务处理加工返回数据集合。再次controller层创建service对象.方法对service对象调用同名方法获取集合对象再次方法返回,并且返回类型为标准返回值类型result
所以controller层是接收请求,响应数据

**分层解耦**
内聚:软件中各个功能模块内部的功能联系
耦合:衡量软件中各个层/模块之间的依赖、关联的程度

耦合的意思大概就是相关联,影响。一改别的也改。关联太大影响就不好,与上面呼应[1]这里一旦修改了类名,创建多态对象就出现问题。故[2]
软件设计原则:高内聚低耦合
[2]可以提供一个容器,存放对象来避免耦合问题。
1.对象交给容器管理2.容器怎么提供所依赖的资源
1.控制反转       2.依赖注入
控制反转:(所有对象交给容器) Inversion 0f Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转
依赖注入:(容器为程序提供依赖资源)Dependency lnjection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
Bean对象:(IOC中创建管理的对象都成为Bean)IOC容器中创建、管理的对象,称之为bean。

**IOC&DI**
Bean的四大注解@component、@Controller、@Service、@Repository
Service以及Dao的实现类交给IOC容器管理只需要在类上面注解@component来指定为bean
service运行时需要dao对象,controller层运行时需要service对象只需要在类的成员变量上不需要再new这个类直接在这个创建接口上方加上注解@Autowired通过类型在容器里寻找bean
作为component的衍生类注解。@Controller专注于标注controller、@Service专门标注service、@Repository标注dao
@Repository("daoA")  指定bean名字,默认是首字母小写的类名

@ComponentScan用于扫描四大注解
前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描
@ComponentScan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SprinqBootApplication中,默认扫描的范围当前包com.ithm所在包及其子包
所以如果放在com.ithm的外面bean就会扫描不上就要手动扫描,指定参数所要扫描的包。如果指定参数默认的就会被覆盖
```
@ComponentScan("dao","com.itheima"))
@SpringBootApplication //默认扫描当前包及其子包
public class SpringbootwebRegRespApplication {
public static void main(String[] args) [ SpringApplic
```
所以都放在com.org包下

关于注入默认@autowired注解的bean是按照类型来注入的,如果不止一个相同类型的bean在注入的时候就会产生错误
通过以下几种方案来解决bean冲突
@Primary来解决bean的优先级,想要哪个bean生效直接在这个bean注解的上面加上这个primary
@Qualifier在Autowired上面加上此注解来指定value属性来指定选择bean的名字(默认为首字母小写的类名)@Qualifier("empServiceA")
@Resource直接不用Autowired不用类型来找bean,直接就写个@Resource(name = "empServiceB")
总结
1.依赖注入的注解
@Autowired:默认按照类型自动装配
如果同类型的bean存在多个
@Primary
@Autowired +@Qualifier("bean的名称”)
@Resource(name="bean的名称”)
2.@Resource 与 @Autowired区别
@Autowired 是spring框架提供的注解,而@Resource是IDK提供的注解。
@Autowired 默认是按照类型注入,而@Resource默认是按照名称注入。


@Mapper来进行持久层注解,来表示是mapper接口也就是dao层
下面作为一个接口,调用的时候不能生成一个对象,然而@Mapper 注解可以自动生成该接口的实现类对象(代理对象)
```
@Mapper
public interface UserMapper {
  @Select("select * from user")
  publie List<User> list();
```
配置sql提示,在写sql语句运用注解的时候配置就可以对sql字符串进行识别提示
选中sql语句不加“”右键show context选择倒数第二项inject language然后再写sql就有提示了
因为没建立数据库连接所以写表名会爆红,找到database点+datasource创建mysql指定user和password和database
 

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值