Spring采用配置文件方式实现AOP

本文介绍使用Spring的配置文件方式实现AOP的过程,通过具体的例子展示了如何定义切面类、配置切入点及关注点,同时提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring可以采用Annotation方式实现AOP,也可以采用配置文件方式实现AOP。本文讲解采用配置文件方式。

 

以配置文件方式实现AOP的时候,切面类就是一个普通的类,需要在配置文件中配置过后才成为切面类。

 

面向接口编程 UserManager.java:

package com.cos;

public interface UserManager {
	public void createUser();
    public void readUser();
    public void updateUser();
    public void deleteUser(int id);
}

接口的实现 UserManagerImpl.java:

package com.cos;

public class UserManagerImpl implements UserManager {

	public void createUser() {
        System.out.println("-----------------createUser-------------------");
    }
    public void readUser() {
        System.out.println("-----------------readUser-------------------");
    }
    public void updateUser() {
        System.out.println("-----------------updateUser-------------------");
    }
    public void deleteUser(int id) {
        System.out.println("-----------------deleteUser-------------------");
    }
}

切面类 SecurityHandler.java:

package com.cos;
//切面类	
public class SecurityHandler{

	public void checkSecurity(){
		System.out.println("----------阿斯多夫--------");
	}
}

配置文件 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:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx" 
	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/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
	
	<!-- 切面类,在aop的配置中会用到此id -->
	<bean id="securityHandler" class="com.cos.SecurityHandler"/>
	
	<bean id="userManagerImpl" class="com.cos.UserManagerImpl"/>
	
	<!-- spring AOP 配置 -->
	<aop:config>
	   <!-- 配置切面类,ref为切面类的引用,在上面应该已经配置完毕。id任意 -->
	   <aop:aspect id="aspectid" ref="securityHandler">
	       <!-- 定义切入点 expression为配置表达式 -->
	       <aop:pointcut id="pointcutid" expression="execution(* com.cos.UserManagerImpl.create*(..))"/>
	       <!-- 定义关注点 method为切面类里的方法,pointcut-ref为pointcut的id -->
	       <aop:before method="checkSecurity" pointcut-ref="pointcutid"/>
	   </aop:aspect>
	</aop:config>
</beans>  

测试类 Client.java:

package com.cos;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {

    public static void main(String[] args) {
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserManager userManager = (UserManager) beanFactory.getBean("userManagerImpl");
        userManager.createUser();
        userManager.updateUser();
        userManager.readUser();
    }
}

 

输出结果:

----------阿斯多夫--------
-----------------createUser-------------------
-----------------updateUser-------------------
-----------------readUser-------------------

 

 

注:

目标对象UserManagerImpl一定要实现一个接口,原因是spring 的AOP用的就是jdk的动态代理机制,而jdk的动态代理机制要求目标对象一定要实现一个接口,这样代理对象也实现同样的这个接口,便完成了代理功能。

 

切面类的关注点方法可以添加一个参数 JoinPoint,此参数的实例可以获得目标方法的参数和方法名等:

package com.cos;

import org.aspectj.lang.JoinPoint;

//切面类	
public class SecurityHandler{

	public void checkSecurity(JoinPoint joinPoint){
	    System.out.println("method====="+joinPoint.getSignature().getName());
	    for(Object o : joinPoint.getArgs()){
	        System.out.println(o.getClass().getName());
	    }
		System.out.println("----------阿斯多夫--------");
	}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值