所需jar包

编写dao
package com.spring.dao;
import org.springframework.stereotype.Component;
@Component("userDAO")
public class UserDao {
    public void say() {
        System.out.println("say method is called");
    }
    public void smile() {
        System.out.println("smile method is called");
    }
    
    public void cry() {
        System.out.println("cry method is called");
    }
    
    public void jump() {
        System.out.println("jump method is called");
    }
}
注意观察包名。@Component("userDAO")等价于在spring配置文件中定义一个<bean id="userDAO"/>
编写Service
package com.spring.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.spring.dao.UserDao;
@Component("userService")
public class UserService {
    
    @Resource(name="userDAO")
    private UserDao dao;
    public UserDao getDao() {
        return dao;
    }
    public void setDao(UserDao dao) {
        this.dao = dao;
    }
    
    public void say() {
        dao.say();
    }
    public void smile() {
        dao.smile();
    }
    
    public void cry() {
        dao.cry();
    }
    
    public void jump() {
        dao.jump();
    }
}
注意观察包名。@Component("userService")等价于在spring配置文件中定义一个<bean id="userService"/> @Resource(name="userDAO")将userDA注入进来
写一个拦截器的类
package com.spring.aop;
import org.springframework.stereotype.Component;
@Component("logIntercepter")
public class LogIntercepter {
    
    public void before(){
        System.out.println("----------before-------------");
    }
    
    public void after(){
        System.out.println("----------after-------------");
    }
    
    public void exception(){
        System.out.println("----------exception-------------");
    }
    
    public void around(){
        System.out.println("----------exception-------------");
    }
}
注意观察包名。@Component("logIntercepter")等价于在spring配置文件中定义一个<bean id="logIntercepter"/>
applicationContext.xml
<?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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    <context:annotation-config/>
    <context:component-scan base-package="com.spring.*"/>
        <aop:config>
            <aop:aspect id="aspect" ref="logIntercepter">
                <aop:pointcut expression="execution(* com.spring.service..*(..))" id="pointCut"/>
                <aop:before method="before" pointcut-ref="pointCut"/>
                <aop:after method="after" pointcut-ref="pointCut"/>
                <aop:after-throwing method="exception" pointcut-ref="pointCut"/>
                <!-- 
                    <aop:around method="around" pointcut-ref="pointCut"/>
                 -->
            </aop:aspect>
        </aop:config>
</beans>
<context:annotation-config/>
 <context:component-scan base-package="com.spring.*"/>
两行为开启spring的注解配置
<aop:aspect id="aspect" ref="logIntercepter"> 引入具体的AOP操作类
<aop:pointcut expression="execution(* com.spring.service..*(..))" id="pointCut"/>声明一个切入点,注意execution表达式的写法
<aop:before method="before" pointcut-ref="pointCut"/> aop前置通知
<aop:after method="after" pointcut-ref="pointCut"/> aop后置通知,
<aop:after-throwing method="exception" pointcut-ref="pointCut"/> aop异常通知
以上结合起来意思就是在调用com.spring.service包或子包下的所有方法之前或之后或抛出异常时依次调用id为logIntercepter的类中的before after exception方法
测试用例
package com.spring.test;
import javax.annotation.Resource;
import org.junit.Test;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import com.spring.service.UserService;
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SpringTest extends AbstractJUnit4SpringContextTests {
    @Resource(name="userService")
    private UserService userService;
    
    @Test
    public void test1(){
        userService.say();
        System.out.println();
        userService.smile();
        System.out.println();
        userService.cry();
    }
    
}
此单元测试基于spring的AbstractJUnit4SpringContextTests,你需要添加spring的关于单元测试的支持
在类上标注@ContextConfiguration(locations="classpath:applicationContext.xml")意思是去classpath路径下加载applicationContext.xml
@Resource(name="userService")意思是把userService注入进来
最终输出结果为:
----------before-------------
say method is called
----------after-------------
----------before-------------
smile method is called
----------after-------------
----------before-------------
cry method is called
----------after-------------
点我下载工程代码