Spring的AOP配置以及常见错误(内附代码)-阿里云开发者社区

开发者社区> 大黄有故事> 正文

Spring的AOP配置以及常见错误(内附代码)

简介: 首先我们可以新建一个包,目录结构如下: User类: package com.hqj.aop; public class User {     @Override     public String toString() {         re...
+关注继续查看

首先我们可以新建一个包,目录结构如下:


User类:

package com.hqj.aop;
public class User {
    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + "]";
    }

    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}


User类接口:

package com.hqj.aop;
public interface UserDao {
    public void save(User user);
}


User类接口类实现:

package com.hqj.aop;
public class UserDaoImpl implements UserDao {
    public void save(User user) {
        System.out.println("User is saved successfully");
    }
}


LogInterceptor类:

public class LogInterceptor {
    public void before() {
        System.out.println("method state");
    }

    public void after() {
        System.out.println("method after");
    }

    public void AfterReturning() {
        System.out.println("method AfterReturning");
    }

    public void AfterThrowing() {
        System.out.println("method AfterThrowing");
    }
}


AOP XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
    ">
    <bean id="user" class="com.hqj.aop.User">
        <property name="username" value="Tim"></property>
        <property name="password" value="123"></property>
    </bean>
    <!-- 配置Bean -->
    <bean id="UserDaoImpl" class="com.hqj.aop.UserDaoImpl"></bean>
    <!-- 配置切面的Bean -->
    <!-- 也就是要记录的数据的地方 (比如错误日志) -->
    <bean id="logInterceptor" class="com.hqj.aop.LogInterceptor"></bean>
    <!-- 配置AOP -->
    <aop:config proxy-target-class="true">
        <!-- 配置切点表达式 -->
        <aop:pointcut expression="execution(* com.hqj.aop.UserDao.save(..))"
            id="servicePointcut" />
        <!-- 配置切面以及通知(指向切面,比如错误日志) -->
        <aop:aspect id="logAspect" ref="logInterceptor">
            <!-- method写切面中(比如错误日志)的方法名称 -->
            <aop:before method="before" pointcut-ref="servicePointcut" />
            <aop:after method="after" pointcut-ref="servicePointcut" />
        </aop:aspect>
    </aop:config>
</beans>


测试MAIN函数:

package com.hqj.aop;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ApplicationContext ctx = new ClassPathXmlApplicationContext("aop.xml");
        UserDaoImpl UDI = (UserDaoImpl) ctx.getBean("UserDaoImpl");
        User user = (User) ctx.getBean("user");
        UDI.save(user);
    }
}


运行结果:

常见错误:

com.sun.proxy.$Proxy2 cannot be cast to com.hqj.aop.UserDaoImpl
    at com.hqj.aop.Main.main(Main.java:12)


解决办法:

<tx:annotation-driven transaction-manager="transactionManager"
                                       proxy-target-class="true"/>
  注意:proxy-target-class属性值决定是基于接口的还是基于类的代理被创建。如果proxy-target-class 属性值被设置为true,那么基于类的代理将起作用(这时需要cglib库)。如果proxy-target-class属值被设置为false或者这个属性被省略,那么标准的JDK 基于接口的代理将起作用。
        即使你未声明 proxy-target-class="true" ,但运行类没有继承接口,spring也会自动使用CGLIB代理。高版本spring自动根据运行类选择 JDK 或 CGLIB 代理package com.hqj.aop;

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring AOP 源码分析——创建代理对象
1.简介 与筛选合适的通知器相比,创建代理对象的过程则要简单不少,本文所分析的源码不过100行,相对比较简单。在接下里的章节中,我将会首先向大家介绍一些背景知识,然后再去分析源码。
991 0
Ubuntu系统下eclipse配置mapreduce插件常见错误和解决办法汇总
在上篇文章中eclipse已经能访问HDFS目录( blog.csdn.net/gamer_gyt/article/details/47209623),但并不能进行Mapreduce编程,在这里小编将常见错误和处理办法进行总结,希望对大家有所帮助 错误1:ERROR [main] util.
1278 0
【spring 注解 错误】使用controller 作为后台给前台ajax交互数据出错
controller作为后台与前台的ajax进行交互,后台的方法处理完成返回一个boolean类型的值,想传给前台用来判断是否执行成功,BUT,问题来了: 1 严重: Servlet.service() for servlet rest threw exception 2 java.
703 0
1.3—Spring基础配置—3.AOP
Sping学习笔记—AOP
1387 0
备忘:spring jdbc事务代码 mybatis, nhibernate
http://files.cnblogs.com/files/mikelij/mymavenMar1.rar
782 0
Nginx常见配置
Nginx常见配置 一、全局层 #有1个工作的子进程,可以自行修改,但太大无益,因为要争夺CPU,一般设置为 CPU数*核数 worker_processes 1; #一般是配置nginx连接的特性,如1个word能同时允许多少连接 Event { #这是指一个子进程最大允.
1388 0
Spring Boot项目利用MyBatis Generator进行数据层代码自动生成
概 述 MyBatis Generator (简称 MBG) 是一个用于 MyBatis和 iBATIS的代码生成器。它可以为 MyBatis的所有版本以及 2.2.0之后的 iBATIS版本自动生成 ORM层代码,典型地包括我们日常需要手写的 POJO、mapper xml 以及 mapper 接口等。
1837 0
+关注
大黄有故事
java,算法,编程语言相关技术专家
114
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载