1. AOP(面向切面编程)
- 切面表达式:
- AOP 中的切点表达式格式为:
execution([修饰符模式] 返回类型模式 [声明类型模式] 方法名模式(参数模式) [throws模式])
。 - 常见的用法:
execution(* com.sky.mapper.*(..))
:匹配com.sky.mapper
包下的所有方法。execution(* com.sky.mapper..*(..))
:匹配com.sky.mapper
包及其子包下的所有方法。execution(* com.sky.mapper.*.*(..))
:匹配com.sky.mapper
包下的所有类的方法。
- 特别注意:切点表达式中的包名、类名、方法名、参数列表必须没有空格,且方法名不能以
.
结尾。
- AOP 中的切点表达式格式为:
- 注解与 AOP 配合使用:
- 可以通过
@Pointcut
注解指定切点表达式,用于定义要拦截的方法。 - 使用
@annotation
关键字指定要拦截的注解类型,如:@Pointcut("execution(* com.sky.mapper.*(..)) && @annotation(com.sky.annotation.AutoFill)")
。 - 注解上可以指定参数类型,比如
@AutoFill(OperationType.UPDATE)
,用于传递操作类型。
- 可以通过
- AOP 切面类的管理:
- AOP 切面类需要添加
@Component
注解,以便 Spring 容器扫描并管理该类。 - 切面类中的方法需要通过
@Before
、@Around
等注解标记,表示该方法是切面的一部分,在目标方法执行前、执行时或执行后执行。
- AOP 切面类需要添加
- 常见问题:
- 切点表达式中的
@annotation
后需要明确指明包名(包括注解类的完整路径)。 @Component
注解确保切面类作为 Spring Bean 被加载。
- 切点表达式中的
2. JWT(JSON Web Token)
-
JWT 密钥设置与使用:
-
JWT 的密钥用于签发和验证 Token。密钥可以存放在
application.properties
或application.yml
配置文件中。 -
JWT 在生成时使用
signWith
方法签名,解析时通过setSigningKey
进行验证。 -
生成 JWT 示例:
public static String generateToken(String username) { return Jwts.builder() .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 3600000)) .signWith(SignatureAlgorithm.HS256, "your-secret-key-here") .compact(); }
-
-
JWT 校验:
- 使用
JwtUtil.parseJWT
方法解析 Token,可以在其中指定密钥进行验证。 - 校验时通过
Jwts.parser().setSigningKey(SECRET_KEY)
来验证密钥。
- 使用
3. AOP 与动态代理
- JoinPoint 和 MethodSignature:
JoinPoint.getSignature()
返回方法的签名信息,是Signature
对象。MethodSignature.getMethod()
可用于获取目标方法对象,并通过反射操作方法的参数。
- 反射操作:
- 在 AOP 中可以通过反射获取方法的参数并进行修改。通过
joinPoint.getArgs()
方法可以获取方法的参数值,进而修改它们。
- 在 AOP 中可以通过反射获取方法的参数并进行修改。通过
4. Spring 配置与 Bean 管理
- @component 注解:
- AOP 切面类需要加上
@Component
注解,这样才能被 Spring 扫描并管理。 - 在 Spring 配置中,如果需要通过反射访问配置文件中的密钥或其他属性,可以使用
@Value
注解获取单个值,或使用@ConfigurationProperties
注解读取整个配置对象。
- AOP 切面类需要加上
5. 切面表达式的细节与使用
-
切点表达式中的
..
和*
的区别:*
用来匹配任意字符或任意方法名、返回值类型等。..
用来匹配方法参数列表的任意个数与类型。..
常用于表示方法参数的任意组合。
-
调试切点表达式:
-
对比
execution(* com.sky.mapper..*(..))
和
execution(* com.sky.mapper.*.*(..))
..
可以匹配子包的类和方法,而*.*
只能匹配当前包下的所有方法。
-
6. 枚举对象的使用
- 枚举值比较:
- 枚举类型的值可以使用
==
来判断,因为 Java 中的枚举是单例的,==
比较的是引用,因此可以用==
进行判断。
- 枚举类型的值可以使用
7. 反射操作与动态 SQL
-
动态 SQL:
-
在 MyBatis 中,可以使用
<if>
标签进行动态 SQL 生成,例如根据条件动态拼接 SQL 语句。通过<set>
标签可以批量更新字段。 -
示例:
<update id="updateUser"> update user <set> <if test="name != null">name=#{name},</if> <if test="age != null">age=#{age},</if> </set> where id=#{id} </update>
-
8. 常见错误及调试建议
- AOP 切面表达式错误:
- 在编写 AOP 切点表达式时,需要确保表达式格式正确,并且不能遗漏关键符号(如
*
、..
)。 - 错误示例:
execution(* com.sky.mapper.*(..))
中的包名、类名、方法名等部分的格式必须严格遵守 AOP 语法规范,不能出现多余的空格或其他错误。
- 在编写 AOP 切点表达式时,需要确保表达式格式正确,并且不能遗漏关键符号(如
- 调试 AOP:
- 当切点表达式错误时,可以根据错误提示来检查表达式的书写,特别是
*
、..
和包名、类名、方法名的配合使用。
- 当切点表达式错误时,可以根据错误提示来检查表达式的书写,特别是