一:遇到的问题及其解决过程:
1、在学习Spring MVC框架时,遇到采用注解方式定义Controller这一点时,对于注解@RequestMapping这一点比较混乱。
解决:通过在B站看学习视频 ,我知道了当@RequestMapping标注在方法上时,作为请求处理方法在程序接收到对应的URL请求时被调用。而@RequestMapping也可以放在类上时,该类中的所有方法都将映射为相对于类级别的请求,表示控制器所处理的所有请求都被映射到value属性值的指定路径下。
2、在学习MyBatis框架时,对于使用Mapper代理的方法开发DAO,我不是很清楚过程原理。
解决:通过在B站的视频学习以及老师发的笔记资料,我学习到了两者的开发过程和原理,也知道了两者的不同。使用Mapper代理开发DAO,主要是用接口的方法来实现,将很多重复利用的代码例如数据库的配置单独写到一个配置文件中,或是将查询、更改、增加、删除的代码分别写在各自的xml文件中。在使用时,只需调用xml文件便可达到代码的实现。从而使代码更加简洁,便于管理维护。
3、在学习到动态代理这一知识点时,对于老师提供的学习资料中,对于生成代理对象这一块的代码,我没有读懂。
public class StudentServiceFactory implements InvocationHandler
{
private StudentService stuService; //被代理的对象
public StudentServiceFactory(StudentService stuService) {
super();
this.stuService = stuService;
}
public StudentServiceFactory() {
}
//生成代理对象
public StudentService getStudentService()
{
//生成代理对象
//此方法的第一个参数:生成的代理类必须与被代理类在同一个类加载器中,所以此处调用了被代理对象的类加载器
//第二个参数:被代理对象所实现接口的字节码数组,被代理对象可能会实现多个接口,本例中的被代理对象只实现了一个接口
//第三个参数:将实现InvocationHandler接口的类的对象传递进去。
//这个方法会把代理的全部接口用一个由代码动态生成的类实现,将来调用接口中的任何一个方法都会去调用InvocationHandler.invoke()方法。
StudentService stuService=(StudentService)Proxy.newProxyInstance(StudentServiceFactory.class.getClassLoader(), StudentServiceImp.class.getInterfaces(), this);
return stuService;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//调用业务方法之前需要执行的方法
startTransaction();
Object obj=method.invoke(stuService, args);
//调用业务方法之后要执行的方法
stopTransaction();
return obj;
}
//正交的业务逻辑
private void startTransaction()
{
System.out.println("------开启事务");
}
//正交的业务逻辑
private void stopTransaction()
{
System.out.println("------关闭事务");
}
}
解决:通过在B站视频的学习,我理解并可以看懂这块代码段
public StudentService getStudentService()
{
StudentService stuService
(StudentService)Proxy.newProxyInstance(StudentServiceFactory.class.getClassLoader(), StudentServiceImp.class.getInterfaces(), this);
return stuService;
}
以上代码段是使用代理类进行增强,返回的是代理后的对象 。
其中StudentServiceFactory.class是类加载器,StudentServicelmp是被代理对象实现的所有接口。
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {}
所有动态代理类的方法调用,都交给invoke()方法去处理。
proxy:被代理后的对象。
method:将要被执行的方法信息(反射)。
args:执行方法时需要的参数。
二:启发
在学习了这三种框架之后,对产生的问题进一步的解决后,我更加体会到这三种框架的益处。同时,只有在遇到问题,努力去解决问题才会体会到解决困难后的快乐。