zoukankan      html  css  js  c++  java
  • Java AOP切面编程方式

    //创建接口类

    package com.learn.dao;
    import com.learn.model.User;

    public interface UserDAO {

    void save(User user);
    }

     //接口代理类

    package com.learn.daoimpl;
    import org.springframework.stereotype.Component;
    import com.learn.dao.UserDAO;
    import com.learn.model.User;

    @Component
    public class UserDAOImpl implements UserDAO{

    @Override
    public void save(User user) {
    // TODO Auto-generated method stub
    System.out.println(" 继承接口---创建代理对象 执行 User saved!");

    System.out.println(user.getUsername()+"-----抵达代理Service----"+user.getPassword());
    for(int i=0;i<=100;i++){
    System.out.println("-----"+i);
    }
    }
    }

    //User 实体类

    package com.learn.model;

    public class User {
    private String username;
    private String password;

    public User(String username, String password) {
    super();
    this.username = username;
    this.password = password;
    }
    public User(){
    super();

    }
    public String getUsername()
    {
    return username;
    }

    public void setUsername(String name)
    {
    this.username = name;
    }

    public String getPassword(){
    return this.password;
    }

    public void setPassword(String pwd){
    this.password = pwd;
    }
    }

    //动态代理类

    package com.learn.proxy;

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

    import com.learn.model.User;

    public class UserDAOProxy implements InvocationHandler{
    private User user;
    private Object target;

    public void setTarget(Object target) {
    this.target = target;
    }

    public void beforeMethod(Method m) {
    System.out.println(m.getName()+" start...业务参数进行切面处理"+getUser().getUsername()+"----------"+getUser().getPassword());
    for(int i = 1;i<=100;i++){
    System.out.println("开始前"+i);
    }

    }

    public void afterMethod(Method m) {
    System.out.println(m.getName()+" end...");
    System.out.println(m.getName()+" start...业务参数进行切面处理"+getUser().getUsername()+"----------"+getUser().getPassword());
    for(int i = 1;i<=100;i++){
    System.out.println("开始后"+i);
    }
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {

    beforeMethod(method);
    method.invoke(target, args);
    afterMethod(method);

    return null;
    }

    public User getUser() {
    return user;
    }

    public void setUser(User user) {
    this.user = user;
    }
    }

    //Service测试类

    package com.learn.service;
    import java.lang.reflect.Proxy;
    import org.junit.Test;
    import com.learn.dao.UserDAO;
    import com.learn.daoimpl.UserDAOImpl;
    import com.learn.model.User;
    import com.learn.proxy.UserDAOProxy;

    public class UserServiceTest {

    @Test
    public void testProxy(User user){

    System.out.println(" 测试Controller User 传递成功");
    UserDAO userDAO = new UserDAOImpl(); // 要使用动态代理,必须要先new一个被代理的对象(要不然代理代理什么呢?对吧)
    UserDAOProxy uDaoProxy = new UserDAOProxy(); // 使用动态代理也要new一个代理所要完成的业务逻辑
    uDaoProxy.setTarget(userDAO); // 这步算是绑定,将你想要的额外完成的东西与被代理对象联系起来
    uDaoProxy.setUser(user);
    // 这步是创建代理对象了,第一个参数指定类加载器:使得这个代理类能访问被代理对象,第二个参数指定代理类应该具有哪些接口:要不然怎么去代理被代理对象(被代理对象所能做的,你代理也应该能完成,对不对?),第三个参数就是指定,代理对象额外完成的业务逻辑了:如前面所述的获取被代理类的执行时间。
    UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), uDaoProxy);
    userDAOProxy.save(user); // 最后使用代理,代理具有被代理对象的所有方法,而且你还可以在被代理对象的方法执行前或执行后加上额外的业务逻辑。

    }

    }

  • 相关阅读:
    借助浏览器流特性设置宽度
    元素类型的转换
    浮动
    【华为云技术分享】【DevCloud · 敏捷智库】软件开发团队如何管理琐碎、突发性任务(内附下载材料)
    【华为云技术分享】从项目实际问题引发的思考
    【华为云技术分享】文言文也能编程?此诚年度最骚语言也
    【华为云技术分享】这种反爬虫手段有点意思,看我破了它!
    【华为云技术分享】华为云获CCF BDCI 2019金融实体级情感分析大赛冠军
    【华为云技术分享】【鲲鹏来了】鲲鹏迁移过程案例分享
    【华为云技术分享】非编程人学Python,要注意哪些隐秘的错误认知?
  • 原文地址:https://www.cnblogs.com/jessi/p/5482522.html
Copyright © 2011-2022 走看看