`
tianhei
  • 浏览: 207904 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

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("----------阿斯多夫--------");
	}
}

 

 

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics