有趣网站开发,电商网站前端制作分工,技术服务外包公司,英文网站字体大小七. Service
1. 数据与逻辑分离
之前我们讲面向对象设计#xff0c;都是把数据和逻辑放在一起#xff0c;这是理想情况。
现实情况是#xff0c;把对象分为两类#xff0c;一类专门存数据#xff0c;一类专门执行逻辑
存数据的就是一个 Java Bean
存逻辑的叫做 XxxSe…七. Service
1. 数据与逻辑分离
之前我们讲面向对象设计都是把数据和逻辑放在一起这是理想情况。
现实情况是把对象分为两类一类专门存数据一类专门执行逻辑
存数据的就是一个 Java Bean
存逻辑的叫做 XxxService
2. 控制反转
一直以来都是我们自己用 new 关键字配合构造方法来创建对象但我们现在用的是 Spring 框架可以把一些创建对象的活交给 Spring 框架去做。
那么 Spring 框架怎么创建对象呢它主要是配合一些注解来完成对象的创建例如我们一直在用的 Controller 注解当 Spring 程序运行时它会检查这些类上有没有加一些特殊注解例如它发现这个类上加了 Controller 注解框架就知道该由框架来创建这个 CalculatorController 对象默认只会创建一个。
这样的注解还有不少我们现在需要掌握的有 Controller 算一个还有一个是 Service试试把这些 Service 类的创建交给 Spring 吧
Service
class CalculatorService0 implements Cal {public String[] cal(Calculator c) {}public String[][] details(Calculator c) {}
}Service
class CalculatorService1 implements Cal {public String[] cal(Calculator c) {}public String[][] details(Calculator c) {}
}Service
class CalculatorService2 implements Cal {public String[] cal(Calculator c) {}public String[][] details(Calculator c) {}
}Service 的作用就是告诉 Spring这个类以后要创建对象的话不归程序员管了啊归 Spring 管其实 Controller 的作用也是类似的控制器对象虽然我们没 new实际由 Spring 来创建了
把对象的创建权交给 Spring 来完成对象的创建权被交出去这称之为控制反转
3. 依赖注入
那么我们的代码里怎么拿到 Spring 创建的对象呢
Controller
public class CalController {// ...Autowiredprivate Cal[] calArray;// ...}这儿又要引入一个相关的名词依赖注入
比如说这里的 控制器 需要 service 才能工作就可以说控制器对象依赖于 service 对象缺了这些依赖对象行吗不行吧。怎么找到这些依赖对象呢如果是框架帮你找到这些依赖对象按一定规则提供给你就称之为依赖注入
怎么让框架帮你找到这些依赖对象呢答案是 Autowired #mermaid-svg-FPadadS47p9kOnef {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FPadadS47p9kOnef .error-icon{fill:#552222;}#mermaid-svg-FPadadS47p9kOnef .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FPadadS47p9kOnef .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-FPadadS47p9kOnef .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FPadadS47p9kOnef .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FPadadS47p9kOnef .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FPadadS47p9kOnef .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FPadadS47p9kOnef .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FPadadS47p9kOnef .marker.cross{stroke:#333333;}#mermaid-svg-FPadadS47p9kOnef svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FPadadS47p9kOnef g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-FPadadS47p9kOnef g.classGroup text .title{font-weight:bolder;}#mermaid-svg-FPadadS47p9kOnef .nodeLabel,#mermaid-svg-FPadadS47p9kOnef .edgeLabel{color:#131300;}#mermaid-svg-FPadadS47p9kOnef .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-FPadadS47p9kOnef .label text{fill:#131300;}#mermaid-svg-FPadadS47p9kOnef .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-FPadadS47p9kOnef .classTitle{font-weight:bolder;}#mermaid-svg-FPadadS47p9kOnef .node rect,#mermaid-svg-FPadadS47p9kOnef .node circle,#mermaid-svg-FPadadS47p9kOnef .node ellipse,#mermaid-svg-FPadadS47p9kOnef .node polygon,#mermaid-svg-FPadadS47p9kOnef .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FPadadS47p9kOnef .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-FPadadS47p9kOnef g.clickable{cursor:pointer;}#mermaid-svg-FPadadS47p9kOnef g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-FPadadS47p9kOnef g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-FPadadS47p9kOnef .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-FPadadS47p9kOnef .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-FPadadS47p9kOnef .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-FPadadS47p9kOnef .dashed-line{stroke-dasharray:3;}#mermaid-svg-FPadadS47p9kOnef #compositionStart,#mermaid-svg-FPadadS47p9kOnef .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FPadadS47p9kOnef #compositionEnd,#mermaid-svg-FPadadS47p9kOnef .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FPadadS47p9kOnef #dependencyStart,#mermaid-svg-FPadadS47p9kOnef .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FPadadS47p9kOnef #dependencyStart,#mermaid-svg-FPadadS47p9kOnef .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FPadadS47p9kOnef #extensionStart,#mermaid-svg-FPadadS47p9kOnef .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FPadadS47p9kOnef #extensionEnd,#mermaid-svg-FPadadS47p9kOnef .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FPadadS47p9kOnef #aggregationStart,#mermaid-svg-FPadadS47p9kOnef .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FPadadS47p9kOnef #aggregationEnd,#mermaid-svg-FPadadS47p9kOnef .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FPadadS47p9kOnef .edgeTerminals{font-size:11px;}#mermaid-svg-FPadadS47p9kOnef :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} «interface» CalculatorService CalculatorService0 CalculatorService1 CalculatorService2 在 Cal[] 数组上添加 Autowired 即可它是根据类型去问 Spring 要对象Spring 中有很多对象具体要哪个对象呢答案是根据类型要
Cal 表示只要 Spring 创建的对象实现了 Cal 接口就符合条件Cal[] 表示要多个最终的结果是找到 Spring 管理的 CalculatorService0、CalculatorService1、CalculatorService2 三个对象并放入了 Cal[] 数组
4. 由Spring创建JavaBean
Spring 还可以根据请求中的多个查询参数帮我们创建 JavaBean 数据对象
Controller
public class CalController {// ...Autowiredprivate Cal[] calArray;RequestMapping(/cal)ResponseBodyString[] cal(Calculator c, int type) {return calArray[type].cal(c);}RequestMapping(/details)ResponseBodyString[][] details(Calculator c, int type) {return calArray[type].details(c);}}如果提供了无参构造Spring 会优先用它来创建对象并调用 setXXX 方法对属性进行赋值 查询参数有 p那么 Spring 会找一个名为 setP 的方法完成赋值查询参数有 m那么 Spring 会找一个名为 setM 的方法完成赋值查询参数有 yr那么 Spring 会找一个名为 setYr 的方法完成赋值查询参数有 type但 Calculator 对象没有 setType 方法所以 type 并不会存入对象 如果没有无参构造但提供了有参构造Spring 会拿构造方法参数名与查询参数相对应并完成赋值 我们的例子中查询参数有 pmyr构造方法参数名也叫 pmyr根据对应关系完成赋值 注意 不是所有 JavaBean 对象都应该交给 Spring 创建一般只有请求中的数据才会这么做 5. 包结构约定
目前可以划分 3 个包
controller 包用来存放控制器类service 包用来存放业务逻辑类dto 包用来存放存数据的 JavaBean 类dto 是 Data Transfer Object数据传输对象的缩写
最后要注意一下入口类的位置必须放在 service, controller 这几个包的上一层为什么呢
这个入口类它还肩负了一个职责查找 Service, Controller 等注解的类然后创建对象。它查找的范围是在这个类的当前 package 之内因此如果 servicecontroller 等包如果不在这个 package 内那么会查找不到