Spring
-
Spring:提供了IoC(Inverse of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)等功能,简化了企业级应用的开发流程。
SpringMVC:基于MVC(Model-View-Controller,模型-视图-控制器)设计模式,用于处理用户请求和响应,并提供了灵活的请求映射和视图渲染功能。
MyBatis:为数据库访问提供了一个简单而强大的持久层框架,通过SQL映射文件和注解来实现对象关系映射(ORM)。 -
IoC控制反转,指把创建对象交给 Spring 进行管理。
即:反转资源获取方向,把自己创建资源、向环境索取资源的方式变为环境自动将资源准备好,我们享受资源注入。
AOP面向切面编程,AOP 用来封装多个类的公共行为,将那些与业务无关,却为业务模块共同调用的逻辑封装起来,减少系统的重复代码。
-
IoC容器能够自动扫描应用程序中的对象,将它们实例化,并自动注入它们所需要的依赖对象。Spring通过IoC容器来管理所有的Java对象的实例化和初始化,控制着对象与对象之间的依赖关系。依赖注入DI:将对象依赖属性通过配置进行注入。
IOC = 反射实例化 + 依赖注入 + 生命周期管理
-
IoC容器工作流程:
- 初始化:
- 加载配置:读取
@Configuration
、XML或扫描@ComponentScan
- 注册定义:将Bean元信息封装为
BeanDefinition
存入容器
- 加载配置:读取
- 创建bean:
- 实例化:通过反射创建对象(无参构造/工厂方法)
- 依赖注入:用
@Autowired
/@Resource
给属性赋值,递归解决依赖(如A→B→C) - 初始化:回调
@PostConstruct
、InitializingBean
,执行BeanPostProcessor
增强(如AOP代理)
- 运行时:
- 获取Bean:直接调用getBean()或依赖注入
- 事件通知:@EventListener解耦逻辑
- 销毁:
- 调用
@PreDestroy
、DisposableBean
清理资源
- 调用
- 初始化:
-
//三级缓存解决循环依赖,通过三级缓存提前暴露未完全初始化的对象 Map<String, Object> singletonObjects; // 成品Bean Map<String, Object> earlySingletonObjects; // 原始Bean(未增强) Map<String, ObjectFactory> singletonFactories; // 对象工厂
-
bean对象的定义
- @Component注解,被其标注后,Spring容器扫描其所在包时就会将其纳入到Spring容器中进行管理
- @Repository:该注解也可以让当前类被Spring容器管理,这个注解通常标注数据持久层中的类(与数据库打交道的类)
- . @Service:同样受Spring容器管理,这个注解常用于处理业务逻辑的(业务层)类
- @Controller:这个注解通常用来标注Controller类(与客户端打交道,控制器层,在SpringMVC框架中使用)
-
bean冲突
Bean冲突通常指容器中存在多个相同类型的Bean时,依赖注入(
@Autowired
)或显式获取(getBean()
)时无法确定具体实例的问题。@Primary
标记首选Bean@Qualifier
通过Bean名称(或自定义限定符)明确选择具体Bean。@Component("aliPayService") public class AliPayService implements PaymentService {}@Component("weChatPayService") public class WeChatPayService implements PaymentService {}@Autowired @Qualifier("weChatPayService") // 明确指定 private PaymentService paymentService;
-
Bean的作用域
在Spring中,Bean的默认作用域是单例(Singleton),容器启动时创建,生命周期与容器一致。
Prototype(多例)每次注入/获取都创建新实例。
在Spring中可以通过
@Scope
注解来指定bean的作用域范围 -
@Value注解
@Value
注入是将属性值直接注入到bean
中,主要用于注入一些简单类型的属性(如字符串、基本类型等);@Repository public class UserDao {@Value("jdbc:mysql://localhost:3306/tedu")private String databaseUrl;@Value("root")private String username;@Value("root")
-
@Configuration @ComponentScan("cn.tedu.srping") public class AppConfig {}
@Configuration
注解:表示将类AppConfig
标识为一个 Spring 配置类,Spring 会来加载此类,并且读取其中的配置。@ComponentScan
注解:用于指定扫描的包路径com.example.app
。Spring 会自动在cn.tedu.spring
包及其子包下扫描所有被@Component
等注解标注的类,并将这些类注册为 Spring Bean。
-
AOP(面向切面编程)
是面向对象开发的一种补充,它允许开发人员在不改变原来模型的基础上动态的修改模型以满足新的需求,如:动态的增加日志、安全或异常处理等。AOP使业务逻辑各部分间的耦合度降低,提高程序可重用性,提高开发效率。
MyBatis
-
Mybatis是一个优秀的持久层框架,底层基于JDBC实现与数据库的交互;
使用此框架程序员只需要通过注解或者修改xml配置文件的方式配置好需要执行的SQL语句,MyBatis框架会根据SQL语句生成对应的JDBC代码并对数据库中数据进行增删改查操作。
-
mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
-
@Mapper public interface WeiboMapper {/**在微博表中插入数据*/@Insert("INSERT INTO weibo VALUES(NULL,#{content},#{created},#{userId})")int insert(Weibo weibo);/**根据微博id查询数据*/@Select("SELECT id,content,created,user_id userId FROM weibo WHERE id=#{id}")Weibo selectByWeiboId(int id);/**查询所有微博信息*/@Select("SELECT id,content,created,user_id userId FROM weibo")List<Weibo> selectWeibo();/**更新微博表数据*/@Update("UPDATE weibo SET content=#{content},created=#{created},user_id=#{userId} WHERE id=#{id}")int updateById(Weibo weibo);/**删除微博表数据*/@Delete("DELETE FROM weibo WHERE id=#{id}")int deleteById(int id); }
@Mapper是由MyBatis框架提供,用于描述数据层接口,告诉系统底层为此接口创建其实现类,在实现类中定义数据访问逻辑,执行与数据库的会话(交互)。
SpringMVC
-
MVC(Model–view–controller)是软件工程中的一种软件架构模式,基于此模式把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)
视图(View) - UI设计人员进行图形界面设计,负责实现与用户交互,例如html、css、js等都属于这一层的技术
控制器(Controller)- 负责获取请求,处理请求,响应结果,在java中充当控制器对象的一般是servlet。
模型(Model) - 实现业务逻辑,数据逻辑实现。(@Service-描述业务层对象,@Repository-描述数据层对象)
-
Spring MVC 是Spring 框架中基于MVC设计思想,实现的一个用于处理Web请求的框架。这个框架封装了对Servlet的技术的应用,简化了程序员对请求和响应过程中数据的处理。
-
执行流程
客户端发送请求至前端控制器DispatcherServlet;
DispatcherServlet收到请求后,调用处理器映射器HandlerMapping;
HandlerMapping根据请求URL找到具体的Controller;
通过处理器适配器HandlerAdapter适配具体执行该Controller的方式;
Controller处理请求,并返回ModelAndView;
DispatcherServlet通过ViewReslover(视图解析器)确定负责显示数据的具体View;
DispatcherServlet对View进行渲染视图(即将Model填充至视图组件中),并将完整的视图响应到客户端。
-
如果不使用SpringMVC,调用原生servlet,但需要自行处理路由解析、参数绑定、线程管理等基础功能
@WebServlet("/api/*") // 路径匹配 public class CustomServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) {// 获取路径参数String pathInfo = request.getPathInfo(); // 如 "/api/users/1" → 得到 "/users/1"// 获取查询参数String name = request.getParameter("name");// 获取HeaderString userAgent = request.getHeader("User-Agent");} }