Spring-动态代理

例如

查看个人工资:

   * 启动日志,进行记录

   * 启动安全性的框架

   * 验证权限

       如果有权限,则查看工资

       如果没有权限,则输出没有权限



public class Logger {
	public void logging(){
		System.out.println("logging");
	}
}

public class Security {
	public void security(){
		System.out.println("security");
	}
}

public class Privilege {
	private String access;

	public String getAccess() {
		return access;
	}

	public void setAccess(String access) {
		this.access = access;
	}
}

public class SalaryManager {
	private Logger logger;
	private Security security;
	private Privilege privilege;
	public SalaryManager(Logger logger,Security security,Privilege privilege){
		this.logger = logger;
		this.security = security;
		this.privilege = privilege;
	}
	public void showSalary(){
		this.logger.logging();
		this.security.security();
		if("admin".equals(this.privilege.getAccess())){
			System.out.println("正在查看工资:涨了2W");
		}else{
			System.out.println("您没有该权限");
		}
	}
}

public class SalaryTest {
	@Test
	public void test(){
		Logger logger = new Logger();
		Privilege privilege = new Privilege();
		Security security = new Security();
		privilege.setAccess("admin");
		SalaryManager salaryManager = new SalaryManager(logger, security, privilege);
		salaryManager.showSalary();
	}
}

开始重构

public interface SalaryManager {
	public void showSalary();
}

public class SalaryManagerImpl implements SalaryManager{
	@Override
	public void showSalary() {
		System.out.println("正在查看工资:哦哦,涨了2W闽比");
	}
}

/**
 * 1、导入日志、安全性框架、权限 2、目标对象 3、在代理对象的方法中调用上述的方法
 * 
 * @author Administrator
 * 
 */
public class SalaryManagerProxy implements SalaryManager {
	private Logger logger;
	private Security security;
	private Privilege privilege;
	private SalaryManager target;

	public SalaryManagerProxy(Logger logger, Security security,
			Privilege privilege, SalaryManager target) {
		this.logger = logger;
		this.security = security;
		this.privilege = privilege;
		this.target = target;
	}

	@Override
	public void showSalary() {
		this.logger.logging();// 启动日志
		this.security.security();// 安全性框架
		if ("admin".equals(this.privilege.getAccess())) {
			this.target.showSalary();
		} else {
			System.out.println("您没有权限");
		}
	}

}

public class ProxyTest {
	@Test
	public void test(){
		Logger logger = new Logger();
		Privilege privilege = new Privilege();
		privilege.setAccess("asdf");
		Security security = new Security();
		SalaryManager target = new SalaryManagerImpl();
		SalaryManagerProxy proxy = new SalaryManagerProxy(logger, security, privilege, target);
		proxy.showSalary();
	}
}




动态代理重构



/**
 * 1、把日志、安全性框架、权限导入进去
 * 2、把目标类导入进去
 * 3、上述两类通过构造函数赋值
 * @author Administrator
 *
 */
public class SalaryInterceptor implements InvocationHandler{
	
	private Logger logger;
	private Security security;
	private Privilege privilege;
	
	private Object target;
	
	public SalaryInterceptor(Logger logger,Security security,Privilege privilege,Object target){
		this.logger = logger;
		this.security = security;
		this.privilege = privilege;
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// TODO Auto-generated method stub
		System.out.println("aaaaaa");
		this.logger.logging();
		this.security.security();
		if("admin".equals(this.privilege.getAccess())){
			//调用目标类的目标方法
			method.invoke(this.target, args);
		}else{
			System.out.println("您没有该权限");
		}
		System.out.println("bbbbbb");
		return null;
	}

}

/**
 * 1、拦截器的作用究竟是什么?
 *     *  给目标类及其他的类赋值
 *     *  拦截器中的invoke方法的内容就是代理对象的方法的内容
 * 2、代理对象的方法体是什么?
 *     就是拦截器中invoke方法中的内容
 * 3、在拦截器中有一个方法为invoke方法的第二个参数method,该参数是什么时候传递进去的
 *     代理对象调用方法的时候,就进入了拦截器中invoke方法中
 * 4、动态代理模式到底解决了什么问题
 * @author Administrator
 */
public class ProxyTest {
	@Test
	public void test(){
		Logger logger = new Logger();
		Privilege privilege = new Privilege();
		privilege.setAccess("aaaa");
		Security security = new Security();
		SalaryManager target = new SalaryManagerImpl();
		SalaryInterceptor interceptor = new SalaryInterceptor(logger, security, privilege, target);
		/**
		 * 1、目标类的类加载器
		 * 2、目标类的所有的接口
		 * 3、拦截器
		 */
		 SalaryManager proxy = (SalaryManager) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), interceptor);
		 proxy.showSalary();//代理对象的代理方法
	}
}

HIbernate

public class Transaction {
	public void beginTransaction(){
		System.out.println("begin transaction");
	}
	
	public void commit(){
		System.out.println("commit");
	}
}

public class Person {
	private Long pid;
	private String pname;
	public Long getPid() {
		return pid;
	}
	public void setPid(Long pid) {
		this.pid = pid;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
}

/**
 * 目标接口
 * @author Administrator
 *
 */
public interface PersonDao {
	public void savePerson();
	public void updatePerson();
	public void deletePerson();
	public List<Person> getPerson();
}

public class PersonDaoImpl implements PersonDao{

	@Override
	public void savePerson() {
		// TODO Auto-generated method stub
		System.out.println("save person");
	}

	@Override
	public void updatePerson() {
		// TODO Auto-generated method stub
		System.out.println("update person");
	}

	@Override
	public void deletePerson() {
		// TODO Auto-generated method stub
		System.out.println("delete person");
	}

	@Override
	public List<Person> getPerson() {
		// TODO Auto-generated method stub
		Person person = new Person();
		person.setPid(1L);
		person.setPname("aaa");
		List<Person> personList = new ArrayList<Person>();
		personList.add(person);
		for(Person person2:personList){
			System.out.println(person2.getPname());
		}
		return personList;
	}

}

public class PersonDaoInteceptor implements InvocationHandler{
	
	private Transaction transaction;
	private Object target;
	
	public PersonDaoInteceptor(Transaction transaction,Object target){
		this.transaction = transaction;
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// TODO Auto-generated method stub
		Object obj;
		String methodName = method.getName();
		if("savePerson".equals(methodName)||
				"updatePerson".equals(methodName)||
				"deletePerson".equals(methodName)){
			this.transaction.beginTransaction();
			obj = method.invoke(this.target, args);//调用目标类的目标方法
			this.transaction.commit();
		}else{
			obj = method.invoke(this.target, args);//调用目标类的目标方法
		}
		return obj;
	}

}

public class PersonDaoTest {
	@Test
	public void test(){
		Transaction transaction = new Transaction();
		PersonDao target = new PersonDaoImpl();
		PersonDaoInteceptor inteceptor = new PersonDaoInteceptor(transaction, target);
		PersonDao proxy = (PersonDao)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), inteceptor);
		proxy.getPerson();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值