好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

详细了解MVC+proxy

1、创建业务层UserService接口定义需要完成的功能

?

1

2

3

4

5

6

/**

  * 创建目标接口,定义目标接口要完成的功能

  */

public interface UserService {

     boolean save(User user);

}

2、创建持久层UserDao接口定义具体的CURD

?

1

2

3

4

5

6

/**

  * 创建目标接口,定义目标接口要完成的功能

  */

public interface UserService {

     boolean save(User user);

}

3、完成UserService接口和UserDao的实现类

?

1

2

3

4

5

6

7

8

9

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代码

?

1

2

3

4

5

6

7

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动态代理的增强功能提供事务。这样,事务代码只用写一次,但是每次业务层方法调用时,我们都可以使用代理对象去调用业务层方法来开启事务。实现了代码复用。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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去完成调用

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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? "保存成功" : "保存失败" );

     }

}

总结

本篇文章就到这里了,希望能够帮助到你,也希望您能够多多关注的更多内容!

原文链接:https://blog.csdn.net/qq_45796208/article/details/109551228

查看更多关于详细了解MVC+proxy的详细内容...

  阅读:22次