在xml配置中用到那个标签在开启不然不用,他会报错
1.对接口进行动态代理:创建出来的对象必须转换成接口类型
原因他创建的是实现类而不是不是接口所以实现的时候必须转换成接口
他动态实现的是实现类,他不是继承接口再实现的,而是直接实现接口
所以需要转换 接口 s=Spring 创建动态类();
2.而对类进行动态代理的话就不用转换
因为他是继承实现类重写了里面的方法 子类转换父类是自动转换的所以不用进行转换
动态类(系统自动生成):
动态类:继承与你的类,动态类是自己生成的你是无法操作动态类的。
处理类:想要操作 需要写一个操作类 通知到你的动态类 告诉他怎样实现
aop:
需要引入切面框架Aspect,他是一个独立的框架跟Spring没有任何关系
举例:
@Component()
public class BakService {
public void ZhuCe() {
System.out.println("我要充钱");
}
}
—————————————————————————————
设置处理类代码:这种是通知型的
public class ChuLi {
//切入的表达是
@Pointcut("execution(* my.sun.spring.LianXi..*.*(..))")//这个是引入所有
public void QieMethdf(){}//这个是个空方法为的是引入切入表达式
@Before("QieMethdf()")
public void Method() {
System.out.println("贪玩蓝月欢迎您");
}
@After("QieMethdf()")
public void Method1() {
System.out.println("欢迎您伟大的RMB玩家");
}
}
切面表达式:
这兄弟写的很详细:
https://www.mekau.com/4880.html
execution(
modifier-pattern? //修饰符
ret-type-pattern //返回类型
declaring-type-pattern? //方法模式
name-pattern(param-pattern) //参数模式
throws-pattern? //异常模式
)
/*
整个表达式可以分为五个部分:
1、execution(): 表达式主体。
2、第一个*号:表示返回类型,*号表示所有的类型。
3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。
4、第二个*号:表示类名,*号表示所有的类。
5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。
*/
@pointcut("execution(* com.sample.service.impl..*.*(..))")
环切什么是环切:
Around
(可以做权限,不成立到这里就结束了)
方法前后都监听,这个方法有权限可以选择不执行真实逻辑代码
调用方法时直接进入你的操作类方法
@Component()
//实现类
public class BakService {
public String ZhuCe(String url, String possword) {
return url +possword;
}
}
—————————————————————————————
//处理类
@Around("QieMethdf()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) {
//如果需要返回值的话就需要就方法返回类型声明称Object不确定你的返回值是否是多个且类型一样
Object[] objects = proceedingJoinPoint.getArgs();
//拿到方法实现类的方法参数
//之所以用数据不确定你传进来的参数是多少个
System.out.println(Arrays.toString(objects));
System.out.println(proceedingJoinPoint.getTarget());
//拿到你实现类的执行对象
System.out.println("嘻嘻哈哈");
System.out.println(proceedingJoinPoint.getSignature());
//拿到你实现类的执行方法
// objects[0]=objects[0]+"123";
// objects[1]=objects[1]+"456";
// proceedingJoinPoint.proceed();//注意这里有两个一个是返回原参数一个是修改完的参数
if (!objects[1].equals("哈哈")) {
try {
throw new MiErrorException();
} catch (MiErrorException e) {
e.printStackTrace();
}
}
//之前可以加代码
try {
return proceedingJoinPoint.proceed();
//执行实现类中的代码
//将代码中的值返回除去
} catch (Throwable throwable) {
throwable.printStackTrace();
//这个异常是如果你的实现类出了错误,他就会在这报错
}
//之后也可以加代码
System.out.println("滚粗");
return null;
}
//可以通过 System.out.println(bakService.getClass().getName()); 打印对象类名的方式来查看对象是否被监听