首先引入jar包
aspectjrt.jar
aspectjweaver.jar
1、dao
1
2
3
4
5
6 |
package
com.dao; public interface OkpDao { public
void save(); public
void update(); } |
2、impl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
package
com.dao.impl; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import com.dao.OkpDao; @Component ( "okpDaoImpl" ) public class OkpDaoImpl implements
OkpDao{ public
void save() { System.out.println( "OkpDaoImpl.save()" ); } public
void update() { System.out.println( "OkpDaoImpl.update()" ); } } |
3、service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 |
package
com.service; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import
com.dao.OkpDao; @Component public
class OkpService { private
OkpDao okpDao; public
OkpDao getOkpDao() { return
okpDao; } @Resource (name= "okpDaoImpl" ) public
void setOkpDao(OkpDao okpDao) { this .okpDao = okpDao; } public
void save(){ this .okpDao.save(); } public
void update(){ this .okpDao.update(); } @PostConstruct public
void init(){ System.out.println( "容器创建前执行" ); } @PreDestroy public
void destory(){ System.out.println( "容器销毁后执行" ); } } |
4、切面类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 |
package
com.service; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Aspect @Component public
class SaveInter { @Pointcut ( "execution(* com.service.OkpService.*(..))" ) public
void method(){}; @Before ( "method()" ) public
void before(){ System.out.println( "前置通知" ); } @AfterReturning ( "method()" ) public
void doAfter(){ System.out.println( "后置通知" ); } @After ( "method()" ) public
void after(){ System.out.println( "最终通知" ); } } |
@Aspect切面类
@Component 将该类加载到spring容器
@Poincut 定义一个切面
@Before 当执行切面中的方法前,会执行
@AfterReturning 方法执行完执行
@After 相当于方法中的try{}catch{}finally{}中的finally,执行完方法前会执行
5、测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
package
com.service; import org.junit.Test; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; public class OkpServiceTest { @Test public
void testSave() { BeanFactory bf= new
ClassPathXmlApplicationContext( "applicationContext.xml" ); OkpService okp=(OkpService) bf.getBean( "okpService" ); okp.save(); okp.update(); } } |
6、配置文件
<?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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation=" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd"> <context:annotation-config /> <context:component-scan base-package="com"></context:component-scan> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>
使用Aop注解,xml配置文件中要加入<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
运行结果:
log4j:WARN No appenders could be found for logger
(org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN
Please initialize the log4j system
properly.
容器创建前执行
前置通知
OkpDaoImpl.save()
最终通知
后置通知
前置通知
OkpDaoImpl.update()
最终通知
后置通知
Spring的注解学习(ioc,aop结合),布布扣,bubuko.com
原文:http://www.cnblogs.com/volare/p/3677274.html