一:Spring为我们提供了建立代理对象的方法,我们每次获得的对象其实都是代理对象,我们通过aop来给目标对象增加一些功能或者方法
JDK模式:jdk方法是指spring要注解的类,目标实现接口spring自动使用jdk方法来创建
创建方式:引入
创建约束,增加aop的xsln
目标对象–配置对象,
applicationContext.xml配置
配置bean,目标对象,aop对象
<!-- 配置目标对象 -->
<bean name="myUserservice" class="cn.oracle.services.UserServicesImpl"></bean>
<!-- 配置 aop-->
<bean name="myadvice" class="cn.oracle.services.Advices"></bean>
<aop:config>
<!-- 1.配置切入点
切入点表达式:*是该包下的所有类文件 public 可以省略,void是返回类型,带不带参可以用泛型*代替
public void cn.oracle.services.*serviceImpl.*(..)两个点是带参或者不带参的泛型,id唯一,用来绑定执行切面 -->
<aop:pointcut expression="execution (* cn.oracle.services.*.*(..))" id="myPoint"/>
<!-- 加入aop对象,链接目标对象 -->
<aop:aspect ref="myadvice">
<!-- 指定执行方法之前和之后的具体方法 -->
<aop:before method="beginUser" pointcut-ref="myPoint"/>
<aop:after method="afterUser" pointcut-ref="myPoint"/>
</aop:aspect>
</aop:config>
目标对象:
/**
- 目标对象,实现接口,自动用jdk
*/
public class UserServicesImpl implements UserServices {
@Override
public void saveUser() {
System.out.println("执行存储");
}
@Override
public void deleteUser(int id) {
System.out.println("执行删除");
}
@Override
public void updateUser(User user) {
System.out.println("执行修改");
}
aop类
package cn.oracle.services;
import cn.oracle.pojo.User;
//aop
public class Advices {
public void beginUser() {
System.out.println("保存开始了");
}
public void afterUser() {
System.out.println("保存完成了");
}
测试一下:
import static org.junit.Assert.*;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import cn.oracle.pojo.User;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:cn/oracle/services/applicationContext.xml")
public class Zhujieceshi {
@Resource(name="myUserservice")
UserServices use;
//@Resource(name="ProductService")
//ProductserviceImpl prose;
@Test
public void test() {
System.out.println(use.getClass().getName());
use.saveUser();
}
}
如果我们换个不实现接口的类来测试就是用的glib方法
注意的是:aop不能实现接口,不然报错。
二:注解方式实现aop:
package cn.oracle.pojo;
import org.springframework.stereotype.Component;
import cn.oracle.pojo.User;
/**
* 目标类
*/
@Component("userservices")
public class UserServicesImpl implements UserServices {
@Override
public void saveUser() {
System.out.println("执行存储");
}
``package cn.oracle.pojo;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
//注解类
import cn.oracle.pojo.User;
@Component//不指定名字默认给一个别名
@Aspect //指定为切面类
public class Advices {
//前置通知
@Before("execution(* cn.oracle.pojo.*.*(..))")
public void begin() {
System.out.println("开始事务");
}
//后置通知
@AfterReturning(value="execution(* cn.oracle.pojo.*.*(..))",returning="obj")
public void after(JoinPoint joinPoint,Object obj) {
System.out.println("执行完成了");
}
xml配置
```bash
<!-- 测试注解的代理对象-->
<!-- 扫描注解 -->
<context:component-scan base-package="cn.oracle.pojo"/>
<!-- 开启使用注解完成织入 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
测试(注解实现aop)