Spring AOP配置详解

2022-04-29 10:38:08 浏览数 (1)

AOP(Aspect-Oriented Programming), 面向切面编程。

Spring提供的AOP技术可以让我们把软件系统中存在的通用处理作成一个切面,从而可以减少开发人员的工作量。其次,也使得代码更加容易管理。

在软件系统中最常见的权限控制、日志记录都可以做成一个切面,下面将结合以日志切面为例来介绍Spring AOP的配置和使用。

首先,以下介绍的都在另一篇博文的基础之上展开,如果你还未阅读过,建议你先阅读一下:Spring框架配置详情

本文将按照如下的思路进行介绍:

1.导入Spring AOP 以及 LOG4J 所必须的包

2.编写applicationContext.xml文件

3.编写日志切面类

4.编写log4j.properties日志配置文件并新建一个日志文件

5.运行测试类并检查切面中的日志记录是否写入了日志文件

一、导入Spring AOP 以及 LOG4J 所必须的包

点击这里下载:http://pan.baidu.com/s/1o6E1vzs 密码:uijc

下载所需的Jar包导到WEB-INF/lib目录。

二、编写applicationContext.xml文件

代码语言:javascript复制
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans" 
 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4 xmlns:context="http://www.springframework.org/schema/context" 
 5 xmlns:aop="http://www.springframework.org/schema/aop" 
 6 xmlns:tx="http://www.springframework.org/schema/tx" 
 7 xsi:schemaLocation="http://www.springframework.org/schema/beans
 8            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 9            http://www.springframework.org/schema/context
10            http://www.springframework.org/schema/context/spring-context-2.5.xsd
11            http://www.springframework.org/schema/aop
12            http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
13            http://www.springframework.org/schema/tx 
14            http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
15 
16 
17     <!-- Spring整合Hibernate:直接饮用hibernate配置文件-->    
18     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
19         <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
20     </bean>
21     
22     <!-- 创建baseDao对象 -->
23     <bean id="baseDao" class="com.basehibernate.dao.impl.BaseDaoImpl">
24         <!-- 在Dao中使用hibernateTemplate必须注入sessionFactory -->
25         <property name="sessionFactory" ref="sessionFactory"/>
26     </bean>
27     
28     <!-- 将日志切面交给Spring容器管理 开始-->
29     <bean id = "logAspectJ" class="com.basehibernate.aop.LogAspectJ"/>
30     <aop:config>
31         <aop:aspect id="logaop" ref="logAspectJ">
32             <!-- 配置切入点 -->
33             <aop:pointcut id="logpointcut" expression="execution(* com.basehibernate.dao.impl.*.*(..))"/>
34             
35             <aop:before pointcut-ref="logpointcut" method="beforeAdvice"/>
36             <aop:after pointcut-ref="logpointcut" method="afterAdvice"/>
37         </aop:aspect>
38     </aop:config>
39     <!-- 将日志切面交给Spring容器管理 结束-->
40 </beans>

第28-40行代码为声明日志切面

三、编写日志切面类

LogAspectJ.java类:

代码语言:javascript复制
 1 /**
 2  * 日志切面
 3  */
 4 package com.basehibernate.aop;
 5 
 6 import org.apache.log4j.Logger;
 7 import org.aspectj.lang.JoinPoint;
 8 
 9 public class LogAspectJ {
10     
11     public Logger logger = Logger.getLogger(LogAspectJ.class);
12     
13     //前置通知
14     public void beforeAdvice(JoinPoint jp)
15     {
16         String info = "【前置通知】:"   jp.getTarget().getClass().getName()   "类的"   jp.getSignature().getName()   "方法开始执行!";
17         logger.info(info);
18     }
19     
20     //最终通知
21     public void afterAdvice(JoinPoint jp)
22     {
23         String info = "【最终通知】:"   jp.getTarget().getClass().getName()   "类的"   jp.getSignature().getName()   "方法开始执行!";
24         logger.info(info);
25     }
26 }

五、编写log4j.properties日志配置文件并新建一个日志文件

在src目录下新建log4j.properties文件,配置LOG4J:

代码语言:javascript复制
 1 #设置级别
 2 log4j.rootLogger=info,appender1
 3 
 4 #输出到文件(这里默认为追加方式)
 5 log4j.appender.appender1=org.apache.log4j.FileAppender
 6 #设置文件输出路径为文本文件
 7 log4j.appender.appender1.File=D:/Workspaces/BaseSpringAOP/WebRoot/log/system.log
 8 #设置文件输出样式
 9 log4j.appender.appender1.layout=org.apache.log4j.PatternLayout  
10 log4j.appender.appender1.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:sss,SSS}] -%m%n 

在WebRoot下新建log文件夹,在log文件夹新建system.log日志文件。

六、运行测试类并检查切面中的日志记录是否写入了日志文件

代码语言:javascript复制
 1 package com.basehibernate.test;
 2 
 3 import org.junit.Test;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6 import com.basehibernate.dao.BaseDao;
 7 import com.basehibernate.pojo.Employee;
 8 
 9 public class SpringTest {
10     
11     static ApplicationContext ctx = null;
12     @Test public void initParam()
13     {
14         ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
15         BaseDao dao = (BaseDao)ctx.getBean("baseDao");
16         
17         Employee empl = new Employee();
18         empl.setEmplName("员工222");
19         empl.setPassword("2222");
20         empl.setPwFlag(true);
21         empl.setAutoEat(true);
22         
23         dao.save(empl);
24     }
25 }

如果成功,将在system.log文件下可以看到:

0 人点赞