-
Spring 动态代理 写法2
-
建立接口,如果使用CGLIB的代理方式是可以不建立接口的
public interface IUserService { /** * 获取所有的用户对象列表 * @return */ List<Object> getAllUser(); /** * 保存用户 * @param user * @return */ boolean saveUser(Object user); /** * 根据用户uid删除该uid对应的用户信息 * @param uid * @return */ boolean deleteUser(int uid); /** * 更新指定用户信息 * @param obj * @return */ boolean updateUser(Object obj); }
-
新建实现接口的被代理类
public class UserServiceImpl implements IUserService { ApplicationContext ac; @Override public List<Object> getAllUser() { System.out.println("--------getAllUser----------"); return new ArrayList<>(); } @Override public boolean saveUser(Object user) { System.out.println("--------saveUser----------"); return true; } @Override public boolean deleteUser(int uid) { System.out.println("--------deleteUser----------"); return false; } @Override public boolean updateUser(Object obj) { System.out.println("--------updateUser----------"); return true; } }
-
MyAspect:代理类
public class MyAspect implements MethodInterceptor {//实现拦截 private void before(){ /** 原方法运行前需要运行的方法 **/ System.out.println("---------before----------"); } private void after(){ /** 原方法运行后需要运行的方法 **/ System.out.println("---------after----------"); } @Override public Object invoke(MethodInvocation invocation) throws Throwable { before(); // 业务处理方法的调用 Object obj = invocation.proceed(); after(); return obj; } }
配置beans.xml
-
申请命名空间,这样我们就可以使用"http://www.springframework.org/schema/aop"里的标签
-
-
配置如下
<bean id="us" class="com.qfedu.aop04.UserServiceImpl" /> <bean id="my" class="com.qfedu.aop04.MyAspect" /> <aop:config proxy-target-class="true" > <!-- 定义一个aop的切点 execution(返回类型 包.类名.方法名(参数)) --> <aop:pointcut id="pt" expression="execution(* com.qfedu.aop04.*.*(..))"/> <!----> <aop:advisor advice-ref="my" pointcut-ref="pt"/> </aop:config>
pointcut切点:程序中需要注入advice的位置的集合,指名执行advice的触发条件
advice:可以理解为代理方法的实现,向切点注入的代码
advisor:pointcut和advice的配置器,将advice注入到pointcut的位置
-
需要在pom.xml中添加AspectJ依赖,此包定义了AOP语法
<dependency> <groupId>org.aspectj</groupId> <artifactId>com.springsource.org.aspectj.weaver</artifactId> <version>1.6.8.RELEASE</version> </dependency>
-
Spring 动态代理 写法3
-
接口和实现类与方法2相同,但是MyAspect代理类无序实现MethodInterceptor
public class MyAspect { /** * 被代理对象之前的方法 */ private void before(){ System.out.println("---------before----------"); } /** * 被代理对象之后的方法 */ private void after(){ System.out.println("---------after----------"); } }
-
同样需要添加命名空间和AspectJ依赖,配置修改如下
<bean id="us2" class="com.qfedu.aop05.UserServiceImpl" /> <bean id="my2" class="com.qfedu.aop05.MyAspect" /> <aop:config proxy-target-class="true"> <aop:aspect ref="my2"> <aop:pointcut id="mpc" expression="execution(* com.qfedu.aop05.*.*(..))"/> <!-- 原方法之前需要运行的代理方法 --> <aop:before method="before" pointcut-ref="mpc"/> <!-- 原方法之后需要运行的代理方法 --> <aop:after method="after" pointcut-ref="mpc"/> </aop:aspect> </aop:config>
-