详细了解MVC+proxy
1、创建业务层UserService接口定义需要完成的功能
/**
* 创建目标接口,定义目标接口要完成的功能
*/
public interface UserService {
boolean save(User user);
}
2、创建持久层UserDao接口定义具体的CURD
/**
* 创建目标接口,定义目标接口要完成的功能
*/
public interface UserService {
boolean save(User user);
}
3、完成UserService接口和UserDao的实现类
public class UserServiceImpl implements UserService {
private UserDao dao=new UserDaoImpl();
@Override
public boolean save(User user) {
boolean success=false;
success=dao.insert(user);
return success;
}
}
这里省略具体的JDBC代码
public class UserDaoImpl implements UserDao {
@Override
public boolean insert(User user) {
System.out.println("insert into t_user (username,password)values('"+user.getUsername()+"','"+user.getPassword()+"')");
return true;
}
}
4、创建InvocationHandler接口的实现类
为什么需要这个接口?
因为在开发中,业务层可能含有涉及到多步数据库操作,所以这一步需要开启事务,但是开发中这样的情况太多了,所以我们需要面向横切面编程,创建代理代理,在调用业务层方法时,我们利用jdk动态代理的增强功能提供事务。这样,事务代码只用写一次,但是每次业务层方法调用时,我们都可以使用代理对象去调用业务层方法来开启事务。实现了代码复用。
public class UserHandler implements InvocationHandler {
//动态创建目标对象
Object target=null;
public UserHandler(Object target){
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//返回值
Object result=null;
//增强功能
System.out.println("begin Transaction.....");
result=result=method.invoke(target,args);
System.out.println("commit Transaction.....");
System.out.println("rollback Transaction.....");
System.out.println("end Transaction.....");
//返回值
return result;
}
}
这里我就用输出语句代表事务语句。
5、创建表示层Servlet去完成调用
public class UserSaveServlet {
public static void main(String[] args) throws Exception {
//需要调用的目标类
Class c= UserServiceImpl.class;
Object obj = c.newInstance();
//获取该类的类加载器
ClassLoader loader = obj.getClass().getClassLoader();
//目标对象实现的接口
Class<?>[] interfaces=obj.getClass().getInterfaces();
//获取InvocationHandler对象
InvocationHandler handler=new UserHandler(obj);
//创建代理对象
//将返回值转为接口类型
UserService service=(UserService)Proxy.newProxyInstance(loader,interfaces,handler);
boolean success=service.save(new User("张三","123456"));
System.out.println(success?"保存成功":"保存失败");
}
}

总结
本篇文章就到这里了,希望能够帮助到你,也希望您能够多多关注脚本之家的更多内容!
相关文章
解决springboot运行出现错误:找不到或无法加载主类com.xxxx.xxxx.Application问题
文章介绍了在服务器上运行一个未使用的Java项目时遇到的“找不到或无法加载主类”错误,并提供了两种解决方法:通过Maven install或build …、Goals输入install并跳过测试来重新构建项目2024-11-11
Mybatis mapper.xml使用全局变量的三种实现方法
文章介绍了在Mybatis的Mapper.xml文件中使用全局变量来动态配置数据库库名的实现方案,包括使用mybaits自带全局变量、使用@value和mybatis进行全局变量定义以及使用@value和mybatis进行全局变量定义并减少形参的方案2025-02-02
SpringBoot中@Configuration和@Bean和@Component相同点详解
这篇文章主要介绍了SpringBoot中@Configuration和@Bean和@Component相同点详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2025-04-04
SpringBoot pdf打印及预览(openhtmltopdf+freemarker)
这篇文章主要介绍了SpringBoot pdf打印及预览(openhtmltopdf+freemarker)2023-05-05


最新评论