Spring 註解 實現 AOP (切面編程)
實現功能:AOP實現模擬日誌
實體類
package top.vkiss.springaop.domain;
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
DAO 層接口
package top.vkiss.springaop.dao;
public interface UserDao {
public void addUser();
public void delUser();
}
DAO 層實現類
package top.vkiss.springaop.dao;
import org.springframework.stereotype.Repository;
@Repository("ud")
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
// TODO Auto-generated method stub
int a = 10/0;
System.out.println(" 添加一名用戶 !");
}
@Override
public void delUser() {
// TODO Auto-generated method stub
System.out.println(" 刪除一名用戶 !");
}
}
service 層接口
package top.vkiss.springaop.service;
public interface UserService {
public void addUser();
public void delUser();
}
service 實現類
package top.vkiss.springaop.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import top.vkiss.springaop.dao.UserDao;
@Service("us")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao ud;
public UserDao getUd() {
return ud;
}
public void setUd(UserDao ud) {
this.ud = ud;
}
@Override
public void addUser() {
// TODO Auto-generated method stub
ud.addUser();
}
@Override
public void delUser() {
// TODO Auto-generated method stub
ud.delUser();
}
}
Action 層接口
package top.vkiss.springaop.action;
public interface UserAction {
public void addUser();
public void delUser();
}
Action 層實現類
package top.vkiss.springaop.action;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import top.vkiss.springaop.service.UserService;
@Controller("userAction")
public class UserActionImpl implements UserAction {
@Autowired
private UserService us;
public UserService getUs() {
return us;
}
public void setUs(UserService us) {
this.us = us;
}
@Override
public void addUser() {
// TODO Auto-generated method stub
us.addUser();
}
@Override
public void delUser() {
// TODO Auto-generated method stub
us.delUser();
}
}
日誌層
package top.vkiss.springaop.log;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;
@Service("daoLog")
@Aspect
public class DaoLog {
@Pointcut("execution( * top.vkiss.springaop.dao.*Impl.*(..) )")
public void pointCut_(){}
@Before("pointCut_()")
public void method_Before(){
System.out.println("。日誌操作...");
}
@After("pointCut_()")
public void method_After(){
System.out.println("。日誌操作後。。。");
}
@AfterThrowing(pointcut="pointCut_()",throwing="e")
public void afterThrows(JoinPoint joinPoint,Exception e){
System.out.println("dao層的_"+joinPoint.getSignature().getName()+"出現了:"+e.toString()+"異常");
}
@AfterReturning(returning="result",pointcut="pointCut_()")
public void method_After_returning(JoinPoint joinPoint,Object result){
System.out.println("。return之後。。。返回值"+result);
}
public Object method_After_around(ProceedingJoinPoint jp){
Object resultObject=null;
try {
System.out.println("方法執行之前 。。。。");
resultObject= jp.proceed() ;
System.out.println("返回值執行的。。。。");
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("出現異常執行的代碼");
}//執行方法
System.out.println("方法執行之後的內容");
return resultObject;
}
}
Test 測試類
package top.vkiss.springaop.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import top.vkiss.springaop.action.CustomerActionImpl;
import top.vkiss.springaop.action.UserActionImpl;
public class TestAOP {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
UserActionImpl uac = (UserActionImpl) ac.getBean("userAction");
//uac.addUser();//異常測試
uac.delUser();
}
}
Spring 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xs
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 開啓註解掃描 -->
<context:component-scan base-package="top.vkiss"></context:component-scan>
<!-- 開啓 AOP 註解 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
項目中用到的jar包
aop 依賴包:
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
struts 2 日誌包:
commons-logging-1.1.3.jar
spring 核心包:
spring-aop-5.0.0.RELEASE.jar
spring-aspects-5.0.0.RELEASE.jar
spring-beans-5.0.0.RELEASE.jar
spring-context-5.0.0.RELEASE.jar
spring-core-5.0.0.RELEASE.jar
spring-expression-5.0.0.RELEASE.jar
注意:spring版本和jdk版本搭配(否則會出現各種異常)
spring 3.0+ & JDK 1.7
spring 4.0+ & JDK 1.8