代理模式的分类: 静态代理 动态代理
角色分析:
抽象角色:一般使用接口或抽象类来解决真实角色:被代理的角色代理角色:代理真实角色,代理真实角色后,进行一些附属操作客户:访问代理对象的人代理模式的好处:
可以使真实角色的操作更加纯粹,不用关注一些公共的业务公共业务交给代理角色,实现业务的分工公共业务发生扩展的时候,方便集中管理 缺点:一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率会变低。动态代理分为两大类: 基于接口的动态代理,基于类的动态代理
基于接口:JDK动态代理基于类:cglibjava字节码实现:javasist实例: 接口类:
package com.navy.dao; public interface UserService{ void add(); void delete(); void query(); void update(); }方法类:
package com.navy.dao; public class UserServiceImpl implements UserService { public void add() { System.out.println("增加一个用户"); } public void delete() { System.out.println("删除一个用户"); } public void query() { System.out.println("查询一个用户"); } public void update() { System.out.println("修改一个用户"); } }动态生成代理类:
package com.navy.dao; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyInvocationHandler implements InvocationHandler { //被代理接口 private Object user; public void setUser(Object user) { this.user = user; } //生成得到代理类 public Object getProxy(){ return Proxy.newProxyInstance(this.getClass().getClassLoader(),user.getClass().getInterfaces(),this); } //处理代理实例,并返回结果 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(user,args); return result; } }主方法:
package com.navy.dao; public class client { public static void main(String[] args) { //真实角色 UserServiceImpl userService = new UserServiceImpl(); //创建代理对象 ProxyInvocationHandler pih = new ProxyInvocationHandler(); //设置代理对象 pih.setUser(userService); //动态生成代理类 UserService proxy = (UserService) pih.getProxy(); proxy.add(); } }动态代理的优点:
静态代理的优点都有一个动态代理类代理的是一个接口,一般就是对应的一类业务一个动态代理类乐意代理多个类,只要是实现同一个接口即可添加依赖:
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency>接口类:
package com.navy.dao; public interface UserService{ void add(); void delete(); void query(); void update(); } package com.navy.dao; public class UserServiceImpl implements UserService { public void add() { System.out.println("增加一个用户"); } public void delete() { System.out.println("删除一个用户"); } public void query() { System.out.println("查询一个用户"); } public void update() { System.out.println("修改一个用户"); } }添加日志类:
package com.navy.log; import org.springframework.aop.AfterReturningAdvice; import java.lang.reflect.Method; public class AfterLog implements AfterReturningAdvice { public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable { System.out.println("执行了"+method.getName()+"方法,返回结果为:"+o); } } package com.navy.log; import org.springframework.aop.MethodBeforeAdvice; import java.lang.reflect.Method; public class Log implements MethodBeforeAdvice { public void before(Method method, Object[] objects, Object o) throws Throwable { System.out.println(o.getClass().getName()+"类的"+method.getName()+"is active"); } }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" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean name="userServiceImpl" class="com.navy.dao.UserServiceImpl"/> <bean name="log" class="com.navy.log.Log"/> <bean name="afetrlog" class="com.navy.log.AfterLog"/> <aop:config> //切入点设置 <aop:pointcut id="pointcut" expression="execution(* com.navy.dao.UserServiceImpl.*(..))"/> //在切入点插入设置 <aop:advisor advice-ref="log" pointcut-ref="pointcut"/> <aop:advisor advice-ref="afetrlog" pointcut-ref="pointcut"/> </aop:config> </beans>添加日志的文件:
package com.navy.diy; public class DiyLog { public void before(){ System.out.println("--------------"); } public void after(){ System.out.println("++++++++++++++"); } }aop配置文件:
<bean name="diylog" class="com.navy.diy.DiyLog"/> <aop:config> <aop:aspect ref="diylog"> <aop:pointcut id="pointcut" expression="execution(* com.navy.dao.UserServiceImpl.*(..))"/> <aop:after method="after" pointcut-ref="pointcut"/> <aop:before method="before" pointcut-ref="pointcut"/> </aop:aspect> </aop:config>配置aop:
<bean name="diylog" class="com.navy.diy.DiyLog"/> <aop:aspectj-autoproxy/>Java类:
package com.navy.diy; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class DiyLog { @Before("execution(* com.navy.dao.UserServiceImpl.*(..))") public void before(){ System.out.println("--------------"); } @After("execution(* com.navy.dao.UserServiceImpl.*(..))") public void after(){ System.out.println("++++++++++++++"); } }