三层架构controller:控制层接收前端发送的请求对请求进行处理并响应数据。service业务逻辑层处理具体的业务逻辑。dao数据访问层Data Access Object持久层负责数据访问操作包括数据的增、删、改、查。为什么要对代码进行拆分遵循单一职责原则便于复用、后期维护分层解耦耦合衡量软件中各个层/各个模块的依赖关联程度内聚软件中各个功能模块内部的功能联系。软件设计原则高内聚低耦合控制反转Inversion Of Control简称IOC。对象的创建控制权由程序自身转移到外部容器这种思想称为控制反转。依赖注入Dependency Injection简称DI。容器为应用程序提供运行时所依赖的资源称之为依赖注入。Bean对象IOC容器中创建、管理的对象称之为Bean。实现分层解耦的思路是什么将项目中的类交给IOC容器管理IOC控制反转应用程序运行时需要什么对象直接依赖容器为其提供DI依赖注入IOC DI 入门1.将Dao及Service层的实现类交给IOC容器管理。2.为Controller及Service注入运行时所依赖的对象。RestController public class UserController { Autowired private UserService userService; RequestMapping(/list) public ListUser list(){ //1.调用service,查询用户信息 ListUser userList userService.list(); //.... }Component//将UserServiceImpl添加入IOC容器中 public class UserServiceImpl implements UserService { Autowired private UserDao userDao; Override public ListUser findAll() { //1.调用dao获取数据 ListString lines userDao.FindAll(); //... }Conponent//将UserDaoImpl添加入IOC容器中 public class UserDaoImpl implements UserDao { Override public ListString FindAll(){ //1.加载并读取user.txt文件获取用户数据 InputStream in this.getClass().getClassLoader().getResourceAsStream(user.txt); ArrayListString lines IoUtil.readLines(in, StandardCharsets.UTF_8,new ArrayList()); return lines; } }1.如何将一个类交给IOC容器管理Component 注意是加在实现类上而非接口上2.如何从IOC容器中找到该类型的bean然后完成依赖注入AutowiredIOC详解要把某个对象交给IOC容器管理需要在对应的类上加上如下注解之一注解说明位置Component声明bean的基础注解不属于以下三类时用此注解ControllerComponent注解标注在控制层类上ServiceComponent注解标注在业务层类上RepositoryComponent注解标注在数据访问层类上由于与mybatis整合用的少注意声明bean的时候可以通过注解的value属性指定bean的名字如果没有指定默认为类名首字母小写。前面声明bean的四大注解要想生效还需要被组件扫描注解ComponentScan扫描。该注解虽然没有显式配置但是实际上已经包含在了启动类声明注解SpringBootApplication中默认的扫描范围是启动类所在包及其子包。1.声明bean注解有哪几个ControllerServiceRepositoryComponent2.注意事项在Springboot集成web开发中声明控制器bean只能用Controller。声明bean的注解要想生效需要被扫描到启动类默认扫描当前包及其子包。DI详解基于Autowired进行依赖注入的常见方式有如下三种1属性注入RestController public class UserController { Autowired private UserService userService; //... }优点代码简洁、方便快速开发缺点隐藏了类之间的依赖关系、可能破坏类的封装性。2: 构造函数注入RestController public class UserController { Autowired//构造器注入如果当前类只有一个构造器可以省略Autowired注解 private UserService userService; public UserController(UserService userService) { this.userService userService; } }优点能清晰地看到类的依赖关系、提高了代码的安全性。缺点代码繁琐、如果构造参数过多可能会导致构造函数臃肿。注意如果只有一个构造函数Autowired注解可以省略。3.setter注入RestController public class UserController { Autowired private UserService userService; public void setUserService(UserService userService) { this.userService userService; } }优点保持了类的封装性依赖关系更清晰。缺点需要额外编写setter方法增加了代码量。Autowired注解默认是按照类型进行注入的。如果存在多个相同类型的bean将会报出如下错误方案一PrimaryPrimary Service public class UserServiceImpl implements UserService { Override public ListUser list(){ //省略... } }方案二QualifierRestController public class UserController{ Autowired Qualifier“userServiceImpl) private UsersService userService }方案三ResourceRestController public class UserController { Resource(name userServiceImpl) private UserService userService; }1.依赖注入的注解Autowired默认按照类型自动装配如果同类型的bean存在多个PrimaryAutowired QualifierResource2.Resource 与 Autowired区别Autowired是Spring框架提供的注解而Resource是JavaEE规范提供的Autowired默认是按照类型注入而Resource默认是按照名称注入