AOP编程+动态代理

    xiaoxiao2026-01-12  0

    下面是一个简单的例子

    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(); } }

    转载请注明原文地址: https://ju.6miu.com/read-1305931.html
    最新回复(0)