设计模式--->静态代理模式
1.代理模式
Spring的AOP就是典型的代理模式实现的,代理模式常用于外围,不影响主业务的一种实现(如日志,事物,日志检测等)
1.什么是代理模式
通过代理为原始类增加额外功能
好处:有利于目标类的维护,增强的更能是可插拔的。
2.名词解释
目标类:如UserServiceImpl
目标方法: login(String username,String password)
额外功能:日志、性能检测、统一异常处理
3.代理类和原始类的关系。
均实现同一个接口,对目标类进行增强。
4.具体代码如下
接口:UserService.java
public interface UserService { public void login(String username,String password); }
目标类:OrderServiceImpl.java
package proxy.service.impl; import proxy.service.UserService; public class UserServiceImpl implements UserService { @Override public void login(String username, String password) { System.out.println("UserServiceImpl.login 我是【service核心】"); } }
代理类:OrderServiceImplProxy
package proxy.service.impl; public class UserServiceImplProxy implements UserService { // 需要对目标方法进行增强就需要先拿到目标类 UserService userService = new UserServiceImpl(); @Override public void login(String username, String password) { System.out.println("UserServiceImplProxy.login 【service外围】"); userService.login(username,password); } }
测试
@Test public void test1() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext5.xml");
UserService userService = (UserService)ctx.getBean("userService");
userService.login("zhangsan","111111");
}
注意这里在applicationContext5.xml的文件中需要注入代理类;
总结
- 静态代理有哪些优势:
- 可以对原有方法进行加强。
- 静态代理有哪些劣势:
- 类会增多一倍,会给类的管理带来难度
- 类中的冗余代码多,比如目标方法的前置增强逻辑和后置增强逻辑均需要在每一个代理类中写一次。
- 有没有更为高明的办法呢?
有的,可以使用spring的动态代理。
有志者、事竟成,破釜沉舟,百二秦关终属楚;
苦心人、天不负,卧薪尝胆,三千越甲可吞吴.
加油吧,致每个正在奋斗路上的你!!!