Spring5 AOP 切面创建增强类

通过创建增强类可以实现在不修改现有类的基础上增加类方法的类容,想用就用,不需要就删掉,实现了代码低耦合。

底层代码

通过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();
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.需要完成的任务 使用UserDaoImp1和User的相关方法,完成如下功能: (1)对空的User对象调用getUserInfo()方法抛出的异常处理 (2)修改UserDaoImp1要求用户id不能修改,修改则抛出异常 (3)使用log4j输出日志信息 2.技能训练 (1)会使用try-catch-finally捕获和处理异常 (2)会使用throw和throws (3)会使用log4j记录日志 3.实践 实践一:使用try-catch进行异常处理 需求说明 (1)使用UserDaoImp1方法查找用户,并用User的getUserInfo()方法输出用户信息 (2)使用一个不存在的用户名查找用户,使用try-catch对抛出的异常进行处理 实现思路及关键代码 (1)在测试调用UserDaoImpaddUser(User user)方法,添加用户,然后用findUser(String uName)方法查找并输出用户信息 (2)在测试调用UserDaoImp1的findUser(String uName)方法,使用不存在的用户名查找用户,并试图输出用户信息 (3)对抛出的异常使用try-catch进行异常处理。 实践二:使用try-catch-finally进行异常处理 需求说明 (1)对实践1的异常使用try-catch-finally进行异常处理 (2)在finally块输出是否抛出了异常 实现思路及关键代码 (1)在任务一的代码上增加finally块 (2)为了判断在finally块输出是否抛出异常,可以设置一个变量,在catch块里修改这个变量 实践四:使用log4j 需求说明 (1)使用log4j输出日志信息 (2)查看输出日志信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值