spring aop一般用在什么场景,你在项目中是怎么用的?
Spring AOP主要用于简化应用程序中的横切关注点,例如日志管理、事务管理、权限控制等。AOP通过分离业务逻辑和横切关注点进行开发,提高了代码复用性、可维护性和可扩展性。常用注解如下:
- @Aspect: 该注解是把此类声明为一个切面类。
- @Before: 该注解是声明此方法为前置通知 (目标方法执行之前就会先执行被此注解标注的方法)
- @After: 该注解是声明此方法为后置通知 (目标方法执行完之后就会执行被此注解标注的方法)
- @AfterReturning: 该注解是声明此方法为返回通知 (目标方法正常执行返回后就会执行被此注解标注的方法)
- @AfterThrowing: 该注解是声明此方法为异常通知 (目标方法在执行出现异常时就会执行被此注解标注的方法)
- @Around: 该注解是环绕通知是动态的,可以在前后都设置执行
- @PointCut: 该注解是声明一个公用的切入点表达式(通知行为的注解的都可以直接拿来复用)
项目中使用场景
- 删除用户后,完成删除用户缓存、用户登录记录、发通知、下线用户、失效自动登录票据等操作
@Aspect
public class UserAdvice {
@Pointcut("execution(* com.hikvision.ga.xauth.authc.user.mapper.UserMgtMapper.deleteAndBakUsers(..))")
private void deleteUsersPoint() {
}
@AfterReturning("deleteUsersPoint()")
@SuppressWarnings("unchecked")
public void deleteUsers(JoinPoint joinPoint) {
try {
if (joinPoint != null && joinPoint.getArgs() != null && joinPoint.getArgs().length > 0) {
List<String> indexCodes = (List<String>) joinPoint.getArgs()[0];
// 清除缓存
cleanUserLoginFailRecord(indexCodes);
clearUserCache(indexCodes);
// 发送mq消息
NotifySpringEventMessageDTO notifySpringEventMessageDTO = NotifySpringEventMessageDTO.builder()
.objectType(ObjectType.USER).operateType(Operate.DELETE).build();
notifySpringEventMessageDTO.baggingData(indexCodes, indexCodes);
applicationEventPublisher.publishEvent(notifySpringEventMessageDTO);
// 批量下线用户 & 失效自动登录票据
loginStatusService.offlineUserByParam(OfflineUserParamBo.builder().userIndexCodes(indexCodes).build());
// 更新划拨状态,已划拨变为未划拨
userTripartiteMapper.updateUserTransfer(null, 0, indexCodes);
}
} catch (Exception e) {
LOGGER.errorWithErrorCode(XauthConstantErrorCode.System.ERR_SYSTEM_ERROR, "[user-mgt] deleteUsersPoint error", e);
}
}
}
- 动态接口参数校验
@Aspect
@Component
public class CustomInterfaceInterceptor {
@Around(value = "@annotation(CustomInterfaceImpl)))")
public Object invoke(ProceedingJoinPoint method) throws Throwable {
try {
// 目标方法执行前,进行一些参数的校验与默认值的赋值
beforeProceed(method.getArgs());
// 调用目标方法
return method.proceed();
} finally {
InterfaceXmlHolder.remove();
}
}
}
WebContextLoaderListener为什么不能注入服务
WebContextLoaderListener属于servlet容器,无法识别spring的注解如@Resource。 在web.xml文件中,将WebContextLoaderListener配置在ContextLoaderListener之后,可以通过WebContext.getBean()获取服务。 org.springframework.web.context.ContextLoaderListener com.hikvision.isupm.listener.WebContextLoaderListener
spring父容器和子容器关系
spring 父容器,管理service、dao层的bean springMVC子容器,管理controller层的bean,可以访问父容器的bean
spring启动过程
ContextLoaderListener实现了ServletContextListener,容器启动的时候会执行contextInitialized方法,初始化 public void contextInitialized(ServletContextEvent event) { initWebApplicationContext(event.getServletContext()); } 创建context,createWebApplicationContext(servletContext); configureAndRefreshWebApplicationContext(cwac, servletContext); AbstractApplicationContext的refresh(),重点代码,xml解析bean等
spring bean生命周期
流程图blog.csdn.net/wanghao1129… 例子www.cnblogs.com/shoshana-ko…
BeanFacotry和ApplicationContext的区别
BeanFacotry是spring中比较原始的Factory,如XMLBeanFactory就是一种典型的BeanFactory,原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。 ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能,此外ApplicationContext包还提供了以下的功能: (1)支持国际化,扩展了MessageSource接口 (2)事件传播 (3)资源访问,如URL和文件 (4)载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层 blog.csdn.net/hi_kevin/ar…
BeanFactory是个Factory,也就是IOC容器或对象工厂,在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理。 FactoryBean是个Bean,FactoryBean是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。 blog.csdn.net/qiesheng/ar…
Spring的bean的作用域
单例:在Spring IOC容器中只存在一个共享的bean实例,所有对bean的请求,返回bean的同一实例。 多例:每次对bean请求都会创建一个新的bean实例。 Request、session、global session这三种作用域用于web应用中。
Spring除了使用XML配置Bean的方式,还有没什么方式?
还有注解的方式。 注解的实现原理有个类全局扫描,自定义类或jar包越多,注解分析的过程越复杂。而且自定义的类还好,如果是JDK 或者第三方的jar包,就没有办法在里面加注解。XML配置只要加载xml文件并分析就行了。 注解的方式可以提高开发效率,但如果对annotation进行修改,需要重新编译整个工程。xml配置功能齐全,对象之间的关系一目了然,但是配置文件配置工作量比较大。 使用情况: 复杂配置使用xml,例如数据源配置,redis配置,缓存配置。 简单配置使用注解,例如由spring管理的dao和service实例,这种bean一般都是@Service(name)和@Resource(name=xxx),没有复杂的配置。
Spring循环依赖
1)构造器循环依赖:表示通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出BeanCurrentlyInCreationException异常表示循环依赖。 2)setter循环依赖:表示通过setter注入方式构成的循环依赖。此依赖只能解决单例作用域的bean循环依赖,通过Spring容器提前暴露刚完成构造器注入但未完成其他步骤(如setter注入)的bean来完成。 对于"prototype"作用域bean,Spring容器无法完成依赖注入,因为Spring容器不进行缓存"prototype"作用域的bean,因此无法提前暴露一个创建中的bean。
springboot配置上传的文件大小
spring-boot-autoconfigure-2.7.17.jar包的spring-configuration-metadata.json文件的spring.servlet.multipart.max-file-size配置 blog.csdn.net/JonTang/art… juejin.cn/post/720364…