spring

82 阅读5分钟

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…

springboot自动装配

blog.csdn.net/huyiju/arti… juejin.cn/post/684490…