欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring AOP编程实例

程序员文章站 2022-05-28 17:01:04
...

一.通过注释实现切面编程

工程结构如下:

Spring AOP编程实例
            
    
    博客分类: spring spring 
1.切面类Log.java,前置通知和后置通知以及环绕通知都在这里配置

package com.bijian.study.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
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.Component;

@Component
@Aspect //切面类
public class Log {
	
	/***
	 * 配置切入点,该方法无方法体
	 * 注意切入申明的格式,execution(Integer(返回的类型) com.bijian.study.service.UserService.add(String))
	 */
    @Pointcut("execution(* com.bijian.study.service..ad*(..))")//申明切人点,一个切入点会有很多的连接点
    public void aspectMethod(){};//配置切入点,该方法无方法体
    
    /***
     * 配置前置通知
     * @param joinpoint
     */
    @Before("aspectMethod()")
    public void dddbefore1(JoinPoint joinPoint){
    	System.out.println("before添加日志"+joinPoint);
    	
    }
    
     /***
     * 配置后置通知
     * @param joinpoint
     */
    @After("aspectMethod()")
    public void after(){
    	System.out.println("after添加日志");
    	
    }
    
     /***
     * 配置环绕通知
     * @param joinpoint
     */
    @Around("aspectMethod()")
    public void around(JoinPoint joinPoint){
    	System.out.println("开始around添加日志");
    	ProceedingJoinPoint pjp=(ProceedingJoinPoint)joinPoint;
    	try {
			pjp.proceed();
		} catch (Throwable e) {
			e.printStackTrace();
		}
    	System.out.println("结束around添加日志");
    }
}
2.业务接口类UserService.java
package com.bijian.study.service;

public interface UserService {
	
	public Integer add(String abc);

	public void aduser(String abc);
}
3.业务接口实现类UserServiceImpl.java
package com.bijian.study.service.impl;

import org.springframework.stereotype.Service;
import com.bijian.study.service.UserService;

@Service
public class UserServiceImpl implements UserService {
	
	@Override
	public Integer add(String abc) {
		System.out.println("添加用户信息1。"+abc);
		return 123;
	}

	@Override
	public void aduser(String abc) {
		System.out.println("添加用户信息2。");
	}
}
4.配置文件bean.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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

  <context:component-scan base-package="com"/>
  <!-- 采用了注释实现自动装配实现代理 -->
  <aop:aspectj-autoproxy/>
</beans>
5.测试类AopTest.java
package com.bijian.study.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.bijian.study.service.UserService;

public class AopTest {

	public static void main(String[] args) {
		
		ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
		UserService userService = (UserService) ac.getBean("userServiceImpl");
		userService.add("123oscar");
		// userService.aduser("456");
	}
}
运行结果:
开始around添加日志
before添加日志execution(Integer com.bijian.study.service.UserService.add(String))
添加用户信息1。123oscar
结束around添加日志
after添加日志

6.说明

  如果不采用spring的配置文件以及注释来申明的话,就需要实现很多的类。

  比如:

  通知类-用于说明切面类具有的功能.MethodBeforeAdvice

  切面类-用于说明具体的需要切入的功能,这个是重点要做的,比如添加日志的功能就在这里log。

  代理对象-用于申明要往哪里去切入日志功能的业务逻辑类proxyFactory。

  被代理对象-具体说明业务逻辑模块。比如Userserviceimpl 用于实现添加用户等功能。

 

二.通过aop配置文件来申明切面类,不用注释

工程结构如下:

Spring AOP编程实例
            
    
    博客分类: spring spring 

  beans.xml配置文件,首先申明了切面类,然后申明了业务逻辑类,然后申明了AOP配置,配置切点和切面以及切入的方法。

1.配置文件bean.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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
        
<!-- <context:component-scan base-package="com" /> <aop:aspectj-autoproxy/>-->
  <!-- 切面类 -->   
  <bean id="log" class="com.bijian.study.aop.Log"></bean>
  <!-- 用户管理 -->
  <bean id="userService" class="com.bijian.study.service.impl.UserServiceImpl"></bean>
  <!-- aop -->    
  <aop:config>
  <!-- 切点 -->
     <aop:pointcut expression="execution(* com.bijian.study.service..*.*(..))" id="pointcut"/>
     <aop:aspect ref="log">
     <!-- 通知 -->
          <aop:before method="dddbefore1" pointcut-ref="pointcut"/>
     </aop:aspect>
  </aop:config> 
</beans>

2.去掉注释的切面类Log.java

package com.bijian.study.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class Log {

	/***
	 * 配置前置通知
	 * 
	 * @param joinpoint
	 */
	public void dddbefore1(JoinPoint joinPoint) {
		System.out.println("before添加日志:" + joinPoint);
		System.out.println("joinPoint.getTarget():" + joinPoint.getTarget());
	}

	/***
	 * 配置后置通知
	 * @param joinpoint
	 */
	public void after() {
		System.out.println("after添加日志");

	}

	/***
	 * 配置环绕通知
	 * @param joinpoint
	 */
	public void around(JoinPoint joinPoint) {
		
		System.out.println("开始around添加日志");
		ProceedingJoinPoint pjp = (ProceedingJoinPoint) joinPoint;
		try {
			pjp.proceed();
		} catch (Throwable e) {
			e.printStackTrace();
		}
		System.out.println("结束around添加日志");
	}
}

3.业务接口类UserService.java

package com.bijian.study.service;

public interface UserService {
	
	public Integer add(String abc);

	public void aduser(String abc);
}

4.业务接口实现类UserServiceImpl.java

package com.bijian.study.service.impl;

import com.bijian.study.service.UserService;

public class UserServiceImpl implements UserService {
	
	@Override
	public Integer add(String abc) {
		System.out.println("添加用户信息1。"+abc);
		return 123;
	}

	@Override
	public void aduser(String abc) {
		System.out.println("添加用户信息2。");
	}
}

5.测试类AopTest.java

package com.bijian.study.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.bijian.study.service.UserService;

public class AopTest {

	public static void main(String[] args) {
		
		ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
		UserService userService = (UserService) ac.getBean("userService");
		userService.add("123oscar");
		// userService.aduser("456");
	}
}

运行结果:

before添加日志:execution(Integer com.bijian.study.service.UserService.add(String))
joinPoint.getTarget():com.bijian.study.service.impl.UserServiceImpl@5762806e
添加用户信息1。123oscar

 

文章来源:https://my.oschina.net/u/2308739/blog/414702

  • Spring AOP编程实例
            
    
    博客分类: spring spring 
  • 大小: 16.7 KB
  • Spring AOP编程实例
            
    
    博客分类: spring spring 
  • 大小: 17.9 KB
相关标签: spring