ssm版本:
1、首先自定义一个注解,该注解有两个属性,一个是模块名,一个是操作的内容。该注解是用来修饰Service层中的方法的。
2、创建一个切面类,该切面使用@Aspect和@Component注解修饰,该页面需要注入一个HttpSession对象。
注意:一个普通的java类是不能注入HttpSession对象的,因此需要在web.xml文件中配置
<!--
此监听器出用于主要为了解决java.beans.Introspector导致内存泄漏的问题
此监听器应该配置在web.xml中与Spring相关监听器中的第一个位置(也要在ContextLoaderListener的前面)
JDK中的java.beans.Introspector类的用途是发现Java类是否符合JavaBean规范
如果有的框架或程序用到了Introspector类,那么就会启用一个系统级别的缓存,此缓存会存放一些曾加载并分析过的JavaBean的引用
当Web服务器关闭时,由于此缓存中存放着这些JavaBean的引用,所以垃圾回收器无法回收Web容器中的JavaBean对象,最后导致内存变大
而org.springframework.web.util.IntrospectorCleanupListener就是专门用来处理Introspector内存泄漏问题的辅助类
IntrospectorCleanupListener会在Web服务器停止时清理Introspector缓存,使那些Javabean能被垃圾回收器正确回收
Spring自身不会出现这种问题
因为Spring在加载并分析完一个类之后会马上刷新JavaBeans Introspector缓存,这就保证Spring中不会出现这种内存泄漏的问题
但有些程序和框架在使用了JavaBeans Introspector之后,没有进行清理工作(如Quartz,Struts),最后导致内存泄漏
-->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!-- 设置Spring中的Http请求事件的监听器,方便Spring在普通的类中也能获取到HttpServletRequest和HttpSession对象 -->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
3、在applicationContext.xml文件中配置aop:aspectj-autoproxy,扫描@Aspect注解。
springboot版本:
日志管理:
1、首先自定义一个注解,自定义的注解需要使用@Target(ElementType.METHOD),@Retention(RetentionPolicy.RUNTIME)修饰,然后给几个属性。
2、定义一个切面然后切面使用@Component,@Aspect修饰,然后定义扫描切入点表达式@After(“execution(* com.syzw.test..service..*(…))”),创建通知类型,通知类型里面可以使用 HttpServletRequest request=((ServletRequestAttributes)(RequestContextHolder.getRequestAttributes())).getRequest();去获取requet对象。
3、在该方法中就可以通过JoinPoint形参去获取实际操作对象的class类,然后就可以获取该到方法,然后可以获取到自定义的注解了就完成了日志的管理。
缺点:
如果需要进行比较信息的日志管理的话,需要在每一个操作dao接口的方法上添加自定义的注解,较为麻烦。
解决方式:
一般会在切面上判断url然后根据url去做相应的操作的,但是这种操作较不灵活。
JoinPoint是一个切入点,它封装了切入点和真实对象的一些信息。
JoinPoint常用的一些api:
getSignature():获取真实访问方法的全路径签名。
getArgs():获取传入目标方法的参数对象。
getTarget():获取被代理的对象。
getThis():获取代理对象。
Signature:
getName():获取操作的方法名。
getClass():获取方法所在的Class类。
注意:
其实每一个注解都对应了一个切面,注解只是其一个声明作用,并没有实际的意义。