AOP切面编程简单实例

  • 【切面结构】

  • 【实现目标】:将新增数据insert插入到“事物处理”中的“开启事物”“提交事物”两个切面中间。
  • 我的文件结构:

  • CategoryDaoImpl
package com.demos.dao.Impl;

import com.demos.dao.CategoryDao;
import com.demos.entity.Category;

//实现接口CategoryDao,就是实现接口里面没有实现的方法
public class CategoryDaoImpl implements CategoryDao {
    @Override
    public void insert(Category category) {
        System.out.println("新增数据");
    }
}
  • CategoryDaoProxy
package com.demos.dao.Impl;

//CategoryDao代理类

import com.demos.dao.CategoryDao;
import com.demos.entity.Category;

public class CategoryDaoProxy implements CategoryDao {
    //要一个产生事物的类的对象
    private ProcessTrans processTrans;
    //目标对象
    private CategoryDaoImpl cdl;

    public CategoryDaoProxy(CategoryDaoImpl cdl,ProcessTrans pt){
        this.cdl = cdl;
        this.processTrans = pt;

    }

    @Override
    public void insert(Category category) {
        this.processTrans.beginTrans();
        this.cdl.insert(category);
        this.processTrans.conmmit();
    }
}
  • DaoFactory(划重点)
package com.demos.dao.Impl;

import com.demos.dao.CategoryDao;
import com.demos.entity.Category;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//数据访问工厂:
//使用代理类方式(CategoryDaoProxy)非常麻烦,一个类就要写一个代理类
//所以使用这个数据访问工厂,用JDK生成代理类

public class DaoFactory {
    private ProcessTrans pt;
    private CategoryDaoImpl cdl;

    public DaoFactory(){
        this.pt = new ProcessTrans();
        this.cdl = new CategoryDaoImpl();
    }
    //用JDK代理来产生代理对象,
    // 并且产生的对象也是CategoryDao这个借口的对象
    public CategoryDao getDaoClass(){
        //生成代理对象
        CategoryDao dao = (CategoryDao) Proxy.newProxyInstance(
                this.getClass().getClassLoader(),
                new Class[]{CategoryDao.class},
                //接下来调用方法
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object result = null;

                        //如果是insert方法,就要改变这个方法的执行
                        if(method.getName().equals("insert")){
                            //改变这个方法的执行
                            pt.beginTrans();
                            //调用你原来对象的方法,得到原来的值
                            cdl.insert((Category) args[0]);
                            //执行然后没有错误,再提交
                            pt.conmmit();
                        }

                        return result;
                    }
                }
        );
        return dao;
    }
}
  • ProcessTrans
package com.demos.dao.Impl;

public class ProcessTrans {
    //开启事务
    public void beginTrans(){
        System.out.println("开启事务");
    }
    //提交事务
    public void conmmit(){
        System.out.println("提交事务");
    }
    //回滚事务
    public void rollback(){
        System.out.println("回滚事务");
    }
}
  • CategoryDao
package com.demos.dao;

import com.demos.entity.Category;

public interface CategoryDao {
    public void insert(Category category);
}
  • Category
package com.demos.entity;

public class Category {
    private Long id;
    private String cname;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }
}
  • TestCategoryImpl
package com.demos.test;

import com.demos.dao.CategoryDao;
import com.demos.dao.Impl.DaoFactory;
import com.demos.entity.Category;
import org.junit.Test;

public class TestCategoryImpl {
    @Test
    public void testInsert() throws Exception{
        //准备一个数据
        Category c =new Category();
        //调用getDaoClass()拿到数据访问对象dao
        CategoryDao dao = new DaoFactory().getDaoClass();
        //调用数据访问对象的insert方法
        dao.insert(c);
    }
}
  • 【测试成功结果】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值