ITEEDU

采用注解(Annotation)方式实现AOP

步骤

  1. 采用Aspect定义切面
  2. 在Aspect定义Pointcut和Advice
  3. 启用AspectJ对Annotation的支持并且将Aspect类和目标对象配置到Ioc容器中

注意:在这种方法定义中,切入点的方法是不被执行的,它存在的目的仅仅是为了重用切入点,即Advice中通过方法名引用这个切人点。

定义切面(Aspect)

切面中为切入点(Pointcut)和通知(Advice)。

package com.iteedu.spring;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class SecurityHandler {

	@Pointcut("execution(* add*(..)) || execution(* del*(..))")
	private void allAddMethod(){};

	@Before("allAddMethod()")
	private void checkSecurity() {
		System.out.println("----------checkSecurity()---------------");
	}
}

allAddMethod()方法就是一个切入点,名称就是allAddMethod。此方法不能有返回值和参数,该方法只是一个标识。注解Pointcut的内容是一个表达式,定义本切入点代表的那些方法(连接点Joinpoint),用于向这些方法传入通知。

checkSecurity()为实际的方法,这里是要植入的通知。注解标识了在哪个切入点何处织入此方法。

配制AOP

<?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:aop="http://www.springframework.org/schema/aop"
	     xmlns:tx="http://www.springframework.org/schema/tx"
	     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
	<!--启用AspectJ对Annotation的支持-->
	<aop:aspectj-autoproxy/>
	<!-- Aspect类 -->
	<bean id="securityHandler" class="com.iteedu.spring.SecurityHandler"/>  
	<!-- 目标对象 -->         
	<bean id="userManager" class="com. iteedu.spring.UserManagerImpl"/>
</beans>

 

目标类

接口

package com.iteedu.spring;

public interface IUserManager {

	public void addUser(String username, String password);
	public void deleteUser(int id);
	public void modifyUser(int id, String username, String password);
	public String findUserById(int id);
}

实现

package com.iteedu.spring;

public class UserManagerImpl implements IUserManager {

	public void addUser(String username, String password) {
		System.out.println("-------addUser()----------");
	}

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

	public String findUserById(int id) {
		System.out.println("-------findUserById()----------");
		return null;
	}

	public void modifyUser(int id, String username, String password) {
		System.out.println("-------modifyUser()----------");
	}
}

 

调用

BeanFactory factory = 
    new ClassPathXmlApplicationContext("applicationContext.xml");
UserManager userManager = 
    (UserManager)factory.getBean("userManager");
userManager.addUser("张三", "123");