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); // 最后使用代理,代理具有被代理对象的所有方法,而且你还可以在被代理对象的方法执行前或执行后加上额外的业务逻辑。

}

}

原文地址:https://www.cnblogs.com/jessi/p/5482522.html