一个Spring框架笔记

news2024/9/24 18:26:14

Spring框架

基于JavaEE的轻量级框架,使用spring可以降低模块的耦合度,提高开发效率。

Spring框架的两大核心技术:

IOC

IOC:控制反转

DI:依赖注入

AOP

面向切面编程

Spring的模块划分:

Spring IOC

Spring AOP

SpringJDBC (Spring + MyBatis)

Spring事务

Spring作用

Dao层 (数据访问层)

数据库的JDBC操作

对应的框架:MyBatis 或 Hibernate(持久层框架)

Service层 (业务逻辑层)

具体的业务逻辑处理

目前没有合适的框架

Spring框架不是用来处理业务逻辑层的

Controller层 (控制层)

Servlet:接收请求、响应数据、请求转发等

对应的框架:SpringMVC

Spring框架:

Bean对象的实例化

配置管理

面向切面编程

自带服务:

定时调度(定时任务)

邮件发送

集成第三方框架

Quartz时钟框架(定时调度)

Spring Security 权限框架

Spring环境搭建

  1. 创建普通的Maven项目 (修改pom.xml配置文件)

  2. 在pom.xml中引入spring框架的依赖坐标

  3. 创建Bean对象

  4. 在resources目录下新建spring.xml配置文件,并设置bean标签

  5. 设置bean标签的id与class属性值 (id是bean对象的唯一标签,class是bean对象的类对象)

  6. 得到spring的上下文环境,通过getBean方法得到指定id的bean对象

Spring IOC容器Bean对象实例化模拟实现

  1. 工厂模式

  2. 反射 (得到指定方法 得到指定字段 调用方法 实例化类)

  3. XML解析 (dom4j + xpath)

  4. 单例模式

  5. 策略模式 (加载配置文件)

Spring IOC容器Bean对象实例化

构造器实例化

通过空构造进行Bean对象的实例化,要求Bean对象提供空构造

<bean id="唯一标识" class="类路径">
</bean>

静态工厂实例化 (了解)

  1. 定义静态工厂类 (普通类)

  2. 在类中定义静态方法,静态方法返回Bean对象的实例对象

  3. 在xml配置文件中通过静态工厂类得到实例化对象

    <bean id="唯一标识" class="静态工厂类的类路径" factory-method="静态工厂类中的静态方法">
    </bean>

实例工厂实例化(了解)

  1. 定义工厂类 (普通类)

  2. 在类中定义方法,方法返回Bean对象的实例对象

  3. 在xml配置文件中,先实例化工厂类

  4. 通过调用工厂类的方法,得到实例化对象

    <bean id="工厂类的唯一标识" class="工厂类的类路径"></bean>
    <bean id="Bean对象的唯一标识" factory-bean="工厂类的唯一标识" factory-method="工厂类中的方法"></bean>

Spring IOC容器配置文件的加载

单配置文件加载

相对路径
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
BeanFactory ac = new ClassPathXmlApplicationContext("spring.xml");
绝对路径(了解)
ApplicationContext ac = new FileSystemXmlApplicationContext("配置文件的绝对路径");

多配置文件加载

可变参数
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml","配置文件名","");
import导入

在一个总的配置文件中导入其他需要加载的配置文件,加载配置文件时只需要加载总的配置文件

spring.xml

<bean id="" class=""></bean>

bean.xml

<bean id="" class=""></bean>

service.xml

<!-- 导入其他配置文件 -->
<import resource="spring.xml"/>
<import resource="bean.xml"/>
BeanFactory ac = new ClassPathXmlApplicationContext("service.xml");

Spring IOC注入

手动注入

set方法注入

需要提供set方法

public class UserService {
    private UserDao userDao;
​
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

设置属性字段的值

<bean id="userService" class="com.shsxt.service.UserService">
    <!-- 
        通过property标签设置字段的值
            name:属性字段的名称 (setXXX)
            ref:指定的bean标签的id
    -->
    <property name="userDao" ref="userDao" />
</bean>
​
<bean id="userDao" class="com.shsxt.dao.UserDao">
</bean>
构造器注入

通过构造器的参数注入

public class UserService {
    private UserDao userDao;
​
    // 带参构造
    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
}

设置属性字段的值

<bean id="userService" class="com.shsxt.service.UserService">
    <!-- 
        通过constructor-arg标签设置字段的值
            name:属性字段的名称
            ref:指定的bean标签的id
    -->
    <constructor-arg name="" ref=""/>
</bean>
​
<bean id="userDao" class="com.shsxt.dao.UserDao">
</bean>
循环依赖问题

当两个或多个类需要互相注入时,构造器注入会出现循环依赖问题。可以通过set方法注入解决。

静态工厂注入 (了解)

实例化工厂注入 (了解)

自动注入

环境准备
  1. 在xml配置文件中引入context的命名空间及规范

  2. 开启自动注入

    <context:annoation-config />
  3. 在需要注入的属性字段上添加注解 (属性字段是JavaBean)

@Resource
  1. 默认根据id属性值查找 (属性字段名与id属性值保持一致)

  2. 如果id属性值不一致,则会根据(Class)类型查找

  3. 注解可以声明在属性字段级别 或 set方法级别

  4. 属性字段可以提供set方法,也可以不提供

  5. 注解可以通过name属性设置别名,如果设置了name属性,就必须要求name属性与bean标签的id属性值一致

  6. 当一个对象有一个接口实现时,正常使用;如果有多个接口实现时,需要使用name设置别名

@Autowired
  1. 默认根据(Class)类型查找,与id属性值无关

  2. 注解可以声明在属性字段级别 或 set方法级别

  3. 属性字段可以提供set方法,也可以不提供

  4. 可以结合@Qualifier设置别名,需要设置@Qualifier的name属性值,name属性值与bean标签的id属性值一致

Spring IOC 扫描器

作用:

统一管理Bean,简化配置文件,提高开发效率

环境准备:

在配置文件中开启扫描器,并设置扫描范围

<context:componet-scan base-package="需要扫描的包目录"/>

注解:

声明在类级别

Controller层
    @Controller
Service层
    @Service
Dao层
    @Repository
任意类
    @Componet

Spring IOC Bean作用域与生命周期

Bean作用域

Spring IOC容器实例化的Bean'对象时单例对象!

单例作用域

当IOC容器实例化Bean对象时,会将实例化的Bean对象设置单例缓存池中,下次再从缓存池中获取

lazy-init懒加载

如果设置true,表示懒加载,IOC容器加载时,不进行Bean对象的实例化,而是在使用Bean对象时进行实例化

如果设置false,表示不懒加载,IOC容器加载时就实例化Bean对象,默认值

lazy-init懒加载为什么要设置为false?

1. 可以提前发现一些潜在的配置文件
2. IOC容器加载时会将Bean对象实例化,使用时不需在实例化,可以提高开发效率

什么对象适合作为单例?

无状态 或状态不可改变的对象

什么是无状态 或状态不可改变的对象?

不存在改变当前对象状态的成员变量。例:controller层、Service层、dao层

原型作用域

当IOC容器实例化Bean对象时,每次都会创建一个新的Bean对象

Web容器中的作用域

request作用域

session作用域

Bean的生命周期

Bean的定义

Bean的初始化

Bean的使用

Bean的销毁

IOC/DI

IOC/DI:控制反转/依赖注入

控制反转:将对象的创建过程转交给外部容器(IOC容器)来实现

依赖注入:给属性字段赋值 (JavaBean对象)

Spring AOP

代理模式

为一个委托类(目标对象)提供一个代理类(代理对象)

作用:可以通过代理对象实现目标对象的行为,并对目标对象的行为进行增强

两个原则:

1. 目标对象与代理对象有共同的行为
2. 代理对象增强目标对象

三要素:

1. 共同的行为
2. 目标对象
3. 代理对象

常见代理模式:

静态代理

动态代理

静态代理

1. 目标对象固定
2. 在程序运行前已经得到目标对象
3. 对目标对象进行增强
4. 当需要大量代理类是,可能会产生"类爆炸"

动态代理

在程序运行时,通过反射机制动态生成代理对象

JDK动态代理

注:要求目标对象有接口实现

通过Proxy类的newProxyInstance()得到代理对象

Object proxy = Proxy.newProxyInstance(类加载器, 接口数组, InvocationHandler接口);

InvocationHandler接口中有invoke方法,代理过程在invoke方法中执行

当代理对象调用方法时,即会执行invoke方法

CGLIB动态代理

注:采用继承思想,定义代理类继承目标类。目标类不能使用final修饰。

需要在pom.xml引入cglib的依赖。

通过Enhancer的create方法,可以生成一个类,并设置该类的父类为目标类。

通过设置Enhancer对象的Callback方法,在callback方法中实现代理过程。

利用MethodInterceptor接口,该接口是Callback的子接口。

Enhancer enhancer = new Enhancer();
// 设置目标类为父类
enhancer.setSuperClass(target.getClass());
// 设置代理过程
enhancer.setCallBack(MethodInterceptor接口);
// 生成类
Object proxy = enhancer.create();

MethodInterceptor接口接口中,一个intercept方法,代理过程在intercept方法中执行

当代理对象调用方法时,即会执行intercept方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用ArcMap实现可视域分析

在 ArcToolbox>>3D Analyst>>可见性>>视域&#xff0c;输入值如图所示&#xff1a; 设置完成后点击确认&#xff0c;生成可视域分析图层 Viewshe1&#xff0c;由内容列表 可见&#xff0c;红色为不可见&#xff0c;绿色为可见。 改变观察点的高度&#xff1a…

pycharm下载selenium等软件包时提示下载超时

1.问题描述 我今天在pycharm运行刚写的自动化脚本时&#xff0c;提示selenium模块未导入&#xff08;自动到导入&#xff09;&#xff0c;鼠标移动到【from selenium import webdriver]的selenium时&#xff0c;显示【未存在文档】 2 解决办法 文件--设置--项目&#xff1a;当前…

企业智能培训新方案,高效打造金牌员工

标品市场竞争激烈&#xff0c;小微企业因长期专注于非标业务或者偏定制化路线&#xff0c;在团队专业能力与大型企业间存在显著差距。专业人才短缺、培养成本高企、培训滞后、效果难测、资源不均、考核标准不一及知识转化率低等问题&#xff0c;成为其业务转型的绊脚石。 如何高…

红外热成像应用场景!

1. 电力行业 设备故障检测&#xff1a;红外热成像仪能够检测电气设备&#xff08;如变压器、电线接头&#xff09;的过热现象&#xff0c;及时发现并定位故障点&#xff0c;预防火灾等安全事故的发生。 水电站查漏&#xff1a;在水电站中&#xff0c;红外热成像仪可用于快速查…

windows自带的录屏功能好用吗?这4款录屏工具也是不错的选择。

因为现在很多人都会有录屏需求&#xff0c;所以平常使用的一些设备当中会有自带的录屏功能。比如windows10系统下只要按下键盘上的 “WinG” 键&#xff0c;就可打开录屏功能。但是录制的时长会有限制&#xff0c;并且录屏功能会有些限制。如果对录屏有更多的需求&#xff0c;可…

网络设备驱动中的调试级别msglevel

网络设备驱动调试级别可以在驱动初始化过程中赋初值&#xff0c;并通过ethtool_ops中.get_msglevel获取&#xff0c;通过.set_msglevel进行设置或修改&#xff0c;并通过如netif_msg_drv这样的宏函数来在需要打印调试信息时进行判断&#xff0c;为真时输出对应级别的调试信息&a…

QT----基于QML的计时器

赶上了实习的末班车,现在在做QML开发,第一天的学习成果,一个计时器.逻辑挺简单的,纯QML实现,代码在仓库QT-Timer 学习使用c的listmodel 学习使用了如何用c的listmodel来存储数据. 新建一个TImeListModel类继承自QAbstractListModel class TimeListModel : public QAbstrac…

AIGC基础工具-科学计算和数据处理的重要库NumPy(Numerical Python)简介

文章目录 1. NumPy 的核心概念1.1 ndarray&#xff1a;多维数组对象示例代码 2. NumPy 的数据类型 (dtype)示例代码 3. NumPy 的数组创建方法3.1 使用 array() 创建数组3.2 使用 zeros() 和 ones()3.3 使用 arange() 和 linspace()3.4 使用 random 模块生成随机数组 4. NumPy 数…

AOT源码解析4.3-model主体解析

1.添加参考图像&#xff08;add_reference_frame&#xff09; 1.1 生成位置编码和ID编码 具体操作见详情。 图1&#xff1a;如图所示&#xff0c;显示的是参考图像的位置编码和id编码的生成过程。对于id编码&#xff0c;将mask图像输入进conv2d卷积网络后&#xff0c;进行结…

容器化安装Jenkins部署devops

基础环境介绍 系统使用的是centos7.9 内核使用的是5.16.13-1.el7.elrepo.x86_64 容器使用的是26.1.4 docker-compose使用的是 v2.29.0 链路图 devops 配置git环境插件 部署好jenkins后开始配置 jenkins连接git&#xff0c;这里需要jenkins有连接git的插件。在已安装的插件…

【SD教程】图片也能开口说话?别惊讶!用SadTalker插件,一键生成自己的数字人,本地部署,免费使用!(附资料)

最近数字人越来越火&#xff0c;连互联网大佬都纷纷下场&#xff0c;比如360的周鸿祎&#xff0c;京东的刘强东等等。小伙伴可能也想拥有自己的数字人如果想用最简单的方式&#xff0c;那么可以用第三方的网站&#xff0c;例如 HeyGen平台、腾讯的智影等等。可这些网站都是收费…

HFSS中看TDR波形详细设置以及相关的解释

时域反射测量&#xff08;TDR&#xff09;中心思想就是用阶跃函数作为激励&#xff0c;应用在模型上&#xff0c;并检查反射随时间的变化。在检查时域之前&#xff0c;必须对driven solution&#xff08;Modal、Terminal或Transient&#xff09;执行插值扫描。然后&#xff0c;…

vite分目录打包以及去掉默认的.gz 文件

1.vite打包情况介绍&#xff1a; 1.1vite在不进行任何配置的情况下&#xff0c;会将除开public的所有引用到资源打包编译添加哈希值至assets文件夹中&#xff08;非引用文件以及行内样式图片未被打包编译资源会被treeSharp直接忽略不打包&#xff09;&#xff0c;     1.2w…

阿里云函数计算 x NVIDIA 加速企业 AI 应用落地

作者&#xff1a;付宇轩 前言 阿里云函数计算&#xff08;Function Compute, FC&#xff09;是一种无服务器&#xff08;Serverless&#xff09;计算服务&#xff0c;允许用户在无需管理底层基础设施的情况下&#xff0c;直接运行代码。与传统的计算架构相比&#xff0c;函数…

极星Polestar EDI 项目案例

近期国内汽车行业供应商J公司收到了极星Polestar的邀请&#xff0c;需要通过EDI与其国内工厂传输业务数据。本案例将为大家介绍对接过程以及实施方案。 梳理需求文档 极星Polestar的EDI需求与Volvo一样&#xff0c;传输协议选择 OFTP&#xff0c;报文标准为EDIFACT&#xff0…

Swing模拟银行柜台系统

> 这是一个基于JavaSwing实现的模拟银行柜台系统。 > 具有管理员、柜员、客户三种登录角色。 > 支持开户、注册、存取款、转账、汇款、账单查询等功能。 > 本项目适合JAVA初学者作为入门学习项目。 一、部分界面演示 二、基础依赖 技术/框架版本描述Java11编…

Vue前端浏览器指纹获取:数字世界的身份密码

程序员必备宝典https://tmxkj.top/#/一个开源的JavaScript库&#xff0c;它通过收集用户浏览器的多种属性&#xff08;如屏幕分辨率、浏览器插件、字体、Canvas和WebGL等&#xff09;来生成一个独特的浏览器指纹&#xff0c;用于识别和追踪用户。 #Github地址 GitHub - finger…

Uniapp时间戳转时间显示/时间格式

使用uview2 time 时间格式 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 <text class"cell-tit clamp1">{{item.create_time}} --- {{ $u.timeFormat(item.create_time, yyyy-mm-dd hh:MM:ss)}} </text>

apply、call和bind的作用和区别

apply与call 首先介绍一下apply与call&#xff0c;因为这两个方法的功能和使用方式都差不多&#xff0c;只是传参的方式不同。call和apply的作用都是改变函数运行时的上下文&#xff08;context&#xff09; 语法 fun.call(thisArg, arg1, arg2, ...)fun.apply(thisArg, arg…

类的难疑点

一、知识点 1、类的属性和对象属性&#xff08;实例属性&#xff09; shuxing"123" self.shuxing"123" 2、类的对象 self.loginMyclass() loginMyclass() 3、访问类属性和方法的操作 通过“类名.属性”访问&#xff1a;Myclass.shuxing 通…