下面是一个简单的例子
1.IUserDao
package cn.itcast.d_myaop1;
//接口
public interface IUserDao {
void save();
}
2.UserDao
package cn.itcast.d_myaop1;
import org.springframework.stereotype.Component;
@Component
public class UserDao implements IUserDao{
@Override
public void save(){
System.out.println("----核心业务:保存!!!----");
}
}
3.ProxyFactory
package cn.itcast.d_myaop1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 代理工厂
* @author Jie.Yuan
*
*/
public class ProxyFactory {
// 目标对象
private static Object target;
private static Aop aop;
// 生成代理对象的方法
public static Object getProxyInstance(Object target_,Aop aop_){
target=target_;
aop=aop_;
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
aop.begin();// 执行重复代码
Object returnValue=method.invoke(target,args);// 执行目标对象的方法
aop.commit();// 执行重复代码
return returnValue;
}
});
}
}
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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
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">
<!-- 开启注解扫描 -->
<context:component-scan base-package="cn.itcast.d_myaop1"></context:component-scan>
<!-- 调用工厂方法,返回UserDao代理后的对象 -->
<bean id="userDao_proxy" class="cn.itcast.d_myaop1.ProxyFactory" factory-method="getProxyInstance">
<constructor-arg index="0" ref="userDao"></constructor-arg>
<constructor-arg index="1" ref="aop"></constructor-arg>
</bean>
</beans>
5.Aop
package cn.itcast.d_myaop1;
import org.springframework.stereotype.Component;
@Component // 加入IOC容器 (切面)
public class Aop{
// 重复执行的代码
public void begin() {
System.out.println("开始事务/异常");
}
public void commit() {
System.out.println("提交事务/关闭");
}
}
6.Junit测试
package cn.itcast.d_myaop1;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
ApplicationContext ac=new ClassPathXmlApplicationContext("cn/itcast/d_myaop1/bean.xml");
@Test
public void testApp(){
IUserDao userDao=(IUserDao) ac.getBean("userDao_proxy");
System.out.println(userDao.getClass());
userDao.save();
}
}