分层解耦
三层架构
- controller:控制层,接收前端发送到请求,对请求进行处理并响应数据。
- service:业务逻辑层,处理具体的业务逻辑。
- dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改、查。
内聚&耦合
-
内聚:软件中各个功能模块内部的功能联系。
-
耦合:衡量软件中各个层/模块之间的依赖、关联程度。
-
软件设计原则:高内聚低耦合
-
Service层及Dao层的实现类,交给IOC容器管理
-
为Controller及Service注入运行时,依赖的对象
-
运行测试
@Component // 将当前类交给IOC容器管理,成为IOC容器中的bean
@Autowired // 运行时,将IOC容器会提供该类型的bean对象,并赋值给该变量 - 依赖注入
-
控制反转(IOC)
- 控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想成为控制反转
注解 | 说明 | 位置 |
---|---|---|
@Componentt | 声明bean的基础注解 | 不属于一下三类时,用此注解 |
@Controller | @Component的衍生注解 | 标注在控制器类上(Controller文件夹) |
@Service | @Component的衍生注解 | 标注在业务类上(Service文件夹) |
@Repository | @Component的衍生注解 | 标注在数据访问类上(由于与mybatis整合,用的少) |
注:
声明bean的时候,可以通过value属性指定bean的名字,如果没有指定 ,默认为类名首字母小写。以上四个注解都可以声明bean,但在springboot集成web开发中,声明控制器bean只能用@Controller
@Repository(value="……")
依赖注入(DI)
-
依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时所依赖的资源。
-
@Autowired
注解,Spring框架提供的,默认是按照类型进行注入,如果存在多个类型相同的bean,就会报错 解决方案:
-
@Primary
:设置优先级,有这个注解的优先@Primary
@Service
public class …… -
@Qualifier
:指定要执行的类@RestController
public class EmpController {
@Autowired
// ------------//
@Qualifier("empServiceA")
private EmpService empService;
} -
@Resource
:JDK提供的注解,直接指定名称,默认按照名称注入@RestController
public class EmpController {
// ------------//
@Qualifier(name = "empServiceB")
private EmpService empService;
}
-
Bean对象
- Bean对象:IOC容器中创建、管理的对象,称之为bean
IOC中的四大注解想生效,还需要被组件扫描注解@ComponentScan
扫描。
@ComponentScan
注解虽然没有显示配置,但实际上已经包含在了启动类生命注解@SpringBootApplication
中,默认扫描范围是启动类所在包及其子包。
@ComponentScan({"java包下的名称……", "……"})
在Spring框架中,Bean是由Spring容器管理的对象,它是应用程序的核心组件之一。Bean是Spring的基本构建块,可以是任何具体的Java对象,包括POJO(Plain Old Java Object)、实体类、服务类、数据访问对象(DAO)、工具类等。
Bean的特点包括:
-
由Spring容器管理:Bean由Spring容器负责创建、装配和管理,Spring容器负责创建Bean的实例,并在需要时将它们注入到其他Bean中。
-
轻量级:Bean是轻量级的,因为它们只是普通的Java对象,没有依赖于Spring特定的接口或基类。
-
可配置:Bean的创建和配置信息通常是通过XML配置文件、Java注解或Java代码进行配置的,Spring提供了灵活的配 置选项。
-
可重用性:Bean的定义可以在应用程序中多次重用,可以在不同的地方注入同一个Bean的实例。
-
依赖注入:Spring通过依赖注入(DI)将Bean之间的依赖关系解耦,使得Bean之间的协作更加灵活和可测试。
在Spring中,Bean可以按照作用域、生命周期、依赖关系等分类。常见的作用域包括单例(singleton)、原型(prototype)、会话(session)、请求(request)等。Bean的生命周期包括初始化、使用和销毁阶段,在这些阶段可以通过回调方法进行处理。Bean之间的依赖关系可以通过构造方法注入、Setter方法注入、字段注入等方式实现。
总的来说,Bean是Spring框架的核心概念之一,它简化了应用程序的开发和管理,提高了代码的灵活性、可维护性和可测试性。
依赖注入
在Spring框架中,通常使用@Autowired注解进行依赖注入,同时也可以使用构造方法注入或Setter方法注入。这些注入方式都是为了解决类之间的依赖关系,提高代码的灵活性、可维护性和可测试性。
- @Autowired注解:
- @Autowired注解是Spring框架提供的依赖注入方式之一,通过注解在需要注入的类属性上标注@Autowired,Spring容器会自动将匹配的依赖对象注入到属性中。
- 例如,可以使用@Autowired注解将一个Service对象注入到另一个Service对象中。
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
- 构造方法注入:
- 构造方法注入是通过在类的构造方法中接收依赖对象来实现依赖注入。
- 使用构造方法注入时,可以在类的构造方法中接收依赖对象,并将其赋值给类的成员变量。
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
- @Resource注解:
- @Resource注解也是Spring框架提供的一种依赖注入方式,类似于@Autowired注解,用于标注要注入的依赖对象。
- 与@Autowired注解不同的是,@Resource注解默认按照名称匹配依赖对象,可以通过name属性指定具体的依赖对象名称。
@Service
public class UserService {
@Resource
private UserRepository userRepository;
}
- 使用Bean获取依赖对象:
- 在Spring容器中,可以通过ApplicationContext.getBean()方法获取需要的依赖对象。
- 这种方式可以手动从Spring容器中获取依赖对象,但通常不推荐,因为它增加了代码的耦合度。
总的来说,无论是@Autowired注解、构造方法注入、@Resource注解还是手动获取依赖对象,都是为了解决类之间的依赖关系,提高代码的灵活性和可维护性。选择使用哪种方式主要取决于个人或团队的偏好以及项目的具体需求。