jdk动态代理

具体文件格式

 

applicationContext.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

xsi :schemaLocation =

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd >

<! - 配置事务管理器- >

< bean id = “tranction” class = “proxy.tranction.tranction” > </ bean >

<! - 配置道- >

< bean id = “employeedao” class = “proxy.dao.impl.employeedaoimpl” > </ bean >

<! - 配置加强事务管理器代理- >

< bean id = “handler” class = “proxy.tranctionhandler.tranctionhandler” >

< property name = “tx” ref = “tranction” > </ property >

< property name = “target” >

< bean class = “proxy.service.impl.employeeserviceimpl” >

< property name = “dao” ref = “employeedao” > </ property >

</ bean >

</ property >

</ bean >

</ beans >

 

 

员工类

package proxy.domain;

 

公共级员工{

}

 

employeedao接口

package proxy.dao;

 

import proxy.domain.employee;

 

public interface employeedao {

// 保存方法

void save(employee emp);

// 更新方法

void update(employee emp);

}

 

 

的EmployeeService接口

package proxy.service;

 

import proxy.domain.employee;

 

public interface employeeservice {

// 保存方法

void save(employee emp);

// 更新方法

void update(employee emp);

}

 

employeedaoimpl实现类

package proxy.dao.impl;

 

import proxy.dao.employeedao;

import proxy.domain.employee;

 

public class employeedaoimpl implements employeedao {

@覆盖

public void save(employee emp){

系统。out .println(保存员工);

}

 

@覆盖

public void update(employee emp){

系统。out .println(更新员工);

}

}

 

 

employeeserviceimpl实现类

package proxy.service.impl;

 

import proxy.dao.employeedao;

import proxy.domain.employee;

import proxy.service.employeeservice;

 

public class employeeserviceimpl实现 employeeservice {

私人 employeedao ;

 

public void setDao(employeedao dao){

这个dao = dao;

}

 

@覆盖

public void save(employee emp){

dao .save(emp);

}

 

@覆盖

public void update(employee emp){

dao .update(emp);

}

}

 

 

 

tranction事务管理类

package proxy.tranction;

 

公共阶级转移{

public void begin(){

系统。out .println(惟有身处卑微的人,最有机缘看到世态人情的真相。一个人不想攀高就不怕下跌,也不用倾压排挤,可以保其天真,成其自然,潜心一志完成自己能做的事。);

}

public void commit(){

系统。out .println(少年贪玩,青年迷恋爱情,壮年汲吸于成名成家,暮年自安于自欺欺人。人寿几何,顽铁能炼成的精金,能有多少?我们曾如此渴望命运的波澜,到最后才发现:人生最曼妙的风景,竟是内心的淡定与从容;我们曾如此期盼外界的认可,到最后才知道:世界是自己的,与他人毫无关系。);

}

public void rollback(){

系统。out .println(我和谁都不争,和谁争我都不屑。简朴的生活,高贵的灵魂是人生的至高境界。);

}

}

 

 

tranctionhandler事务管理增强类

package proxy.tranctionhandler;

 

import proxy.tranction.tranction;

 

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

 

// 事务增强操作类

public class tranctionhandler实现 InvocationHandler {

 

私有对象目标 ; // 真实对象,被代理对象(employeeserviceimpl

私人转移 tx ;

 

public void setTarget(Object target){

这个target = target;

}

 

public void setTx(tranction tx){

这个tx = tx;

}

 

// 创建一个代理类对象

public < T > T getobject(){

对象obj =代理。newProxyInstancetarget .getClass()。getClassLoader(),// 类加载器:sun.misc.Launcher$AppClassLoader@18b4aac2

target .getClass()。getInterfaces(), // 真实对象实现的接口:[Ljava.lang.Class; @ 35fc6dc4

这个); // 增强类型的对象(proxy.tranctionhandler.tranctionhandler@35fc6dc4

系统。out .println(类加载器---- + target .getClass()。getClassLoader());

系统。out .println(真实对象的接口----- + target .getClass()。getInterfaces());

return T)obj;

}

@覆盖

public Object invoke(Object proxy,Method method,Object [] args)抛出 Throwable {

系统。out .println(method + “” + args);

Object ret = null ;

tx .begin();

尝试 {

ret = method.invoke(target,args); // 执行真实对象的方法:public abstract void proxy.service.employeeservice.save(proxy.domain.employee)

tx .commit();

}catch (Exception e){

tx.rollback();

e.printStackTrace();

}

return ret;

}

}

 

 

test测试类

package proxy.test;

 

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import proxy.domain.employee;

import proxy.service.employeeservice;

import proxy.tranctionhandler.tranctionhandler;

 

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("classpath:applicationContext.xml")

public class test {

@Autowired

@Qualifier("handler")

private tranctionhandler handler;

@Test

public void testsave(){

employeeservice service=handler.getobject();//代理对象:class com.sun.proxy.$Proxy12

System.out.println(service.getClass());

service.save(new employee());

}

 

@Test

public void testupdate(){

employeeservice service=handler.getobject();//代理对象:class com.sun.proxy.$Proxy12

System.out.println(service.getClass());

service.update(new employee());

}

// 总结:当调用保存或者更新方法时,底层其实在调用的invoke 方法

}

 

 

测试结果为:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值