通过创建增强类可以实现在不修改现有类的基础上增加类方法的类容,想用就用,不需要就删掉,实现了代码低耦合。
底层代码
通过UserDapImp的接口UserDao为其创建代理类(增强类)
public class UserDaoImp implements UserDao {
@Override
public int add(int a, int b) {
return a+b;
}
}
public class JDKProxy {
public static void main(String[] args) {
Class[] interfaces={UserDao.class};
UserDaoImp userdao=new UserDaoImp();
//返回的对象为UserDaoImp的增强类
UserDao dao=(UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces,new UserDaoProxy(userdao));
int r=dao.add(3,4);
System.out.println(r);
}
}
class UserDaoProxy implements InvocationHandler{
private Object obj;
public UserDaoProxy(Object obj){
this.obj=obj;
}
@Override//增强类的方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName());
Object res=method.invoke(obj,args);//调用原有类中的方法
return res;
}
}
通过注解的方法创建增强类(还可以通过XML创建)
配置XML文件
<!-- 扫描注解-->
<context:component-scan base-package="com.pyj.spring5"></context:component-scan>
<!-- 将带有@Aspect注解的对象变成代理对象-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
被增强的类
@Component(创建对象)
@Component
public class User {
public void add(){
System.out.println("哈哈哈哈add");
}
}
生成代理类(增强类)
@Component(创建对象)
@Aspect(声明创建的是代理对象)
@Before、@After、@AfterReturning、@AfterThrowing、@Around:在不同的位置为原有对象的方法增添类容
execution(* com.pyj.spring5.bean.User.add(..)):选择被增强的类的方法
@Component
@Aspect //生成代理对象
public class UserProxy {
//配置前置通知
@Before(value = "execution(* com.pyj.spring5.bean.User.add(..))")
public void before(){
System.out.println("在add之前执行");
}
@After(value = "execution(* com.pyj.spring5.bean.User.add(..))")
public void after(){
System.out.println("在add之后执行");
}
@AfterReturning(value = "execution(* com.pyj.spring5.bean.User.add(..))")
public void afterReturning(){
System.out.println("在add跑之后执行");
}
@AfterThrowing(value = "execution(* com.pyj.spring5.bean.User.add(..))")
public void throwing(){
System.out.println("在add出错执行");
}
@Around(value = "execution(* com.pyj.spring5.bean.User.add(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("之间add执行1");
//调用原有类的方法
proceedingJoinPoint.proceed();
System.out.println("之间add执行2");
}
}
获得增强类,此时创建的依然是原来的类,但类的方法已经通过注解修改了
public void test1(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
User user=context.getBean("user", User.class);
user.add();
}