三层架构
- Controller(控制层):接收前端发送的请求,对请求进行处理,并响应数据。
- Service(业务逻辑层):处理具体的业务逻辑。
- DAO(数据访问层/持久层):负责数据访问,包括增删改查。
分层解耦
- 控制反转:Inversion Of Control,IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
- 依赖注入:Dependency Injection,DI。容器为应用程序提供运行时所依赖的资源,称之为依赖注入。
- Bean对象:IOC 容器中创建、管理的对象,称之为bean。
- 步骤:
- 希望将 Service 层及 Dao 层的对象,交给 IOC 容器管理,成为IOC容器中的 bean:在对应的类前添加
@Component
注解。 - 为 Controller 及 Service 注入运行时依赖的对象:添加
@Autowired
注解。
- 希望将 Service 层及 Dao 层的对象,交给 IOC 容器管理,成为IOC容器中的 bean:在对应的类前添加
IOC 详解
-
要把某个对象交给IOC容器管理,需要在对应的类前加上如下注解之一:
注解 说明 位置 @Component
声明bean的基础注解 不属于以下三类时,用此注解(工具类) @Controller
@Component的行生注解 标注在控制器类上 @Service
@Component的行生注解 标注在业务类上 @Repository
@Component的行生注解 标注在数据访问类上(由于与mybatis整合,用的少) -
声明 bean 的时候可以通过 value 属性指定 bean 的名字,如果没有指定,默认为类名首字母小写。
-
使用以上四个注解都可以声明 bean,但是在 springboot 集成 web 开发中,声明控制器 bean 只能用
@Controller
。 -
前面声明 bean 的四大注解,要想生效,还需要被组件扫描注解
@ComponentScan
扫描@Componentscan
注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication
中,默认扫描的范围是启动类所在包及其子包。
DI 详解
@Autowired
注解,默认是按照类型进行,如果存在多个相同类型的 bean,将会报错。- @Resource 与 @Autowired 的区别?
@Autowired
是spring框架提供的注解,而@Resource
是JDK提供的注解@Autowired
默认是按照类型注入,而@Resource
默认是按照名称注入。