文档章节

spring aop 注解方式

杨中仁
 杨中仁
发布于 2016/10/01 23:36
字数 834
阅读 94
收藏 3
点赞 0
评论 0

今天大概看了一下spring4的jar 看到了aop  于是看看源码写了一下用例。比较简单,适用于 初学者。

aop的意思 大概应该都懂的。不懂的 可以先百度看看。 下面直接看下简单的例子吧。

 

第一  需要在项目的maven项目下面增加aspect 。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.young</groupId>
    <artifactId>insane-conf</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>insane-dao</module>
        <module>insane-util</module>
        <module>insane-common</module>
        <module>insane-ba</module>
        <module>insane-app</module>
        <module>insane-wap</module>
    </modules>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <!-- 设置框架的版本  v -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        
        <spring.release.version>4.3.3.RELEASE</spring.release.version>
        <mybatis.version>3.3.0</mybatis.version>
        <mysql.version>5.1.26</mysql.version>
        <mybatis.spring.version>1.2.2</mybatis.spring.version>
    </properties>


    <dependencies>
        <!-- spring 框架 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.release.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>3.2.9.RELEASE</version>
        </dependency>

        <!--aop-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.9</version>
        </dependency>

        <!--log-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.6</version>
        </dependency>

        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>


        <!--配置阿里 数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.4</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.5</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.5.2.RELEASE</version>
        </dependency>

        <!-- mybatis 框架 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis.spring.version}</version>
        </dependency>

    </dependencies>

</project>

第二 定义aop的代理  在定义一个扫描的包 配置文件如下。

<?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: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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">


    <!-- 使用注解 2016年09月28日23:38:24 -->
    <context:annotation-config/>

    <!-- 配置包名下面 所有的可以使用注解 注入 -->
    <context:component-scan base-package="org.young.common"></context:component-scan>

    <aop:aspectj-autoproxy/>

    <!--加载properties配置文件-->
    <!--<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">-->
        <!--<property name="locations">-->
            <!--<list>-->
                <!--<value>classpath*:jdbc.properties</value>-->
            <!--</list>-->
        <!--</property>-->
    <!--</bean>-->

    <!--加载其他的spring配置文件-->
    <!--<import resource="spring-db.xml"/>-->

</beans>

 

第三  定义一个接口和实现类 代码如下。

package org.young.common.service;

/**
 * Created by young on 16/9/28.
 */
public interface UserService {

    String say(String name);

}
package org.young.common.service.impl;

import org.springframework.stereotype.Component;
import org.young.common.service.UserService;

/**
 * Created by young on 16/9/28.
 */
@Component("userService")
public class UserServiceImpl implements UserService{


    @Override
    public String say(String name){
        System.out.println("[UserServiceImpl say] --->>> " + name);
        return "[UserServiceImpl say] --->>> " + name;
    }

}

第四  定义一个规范  也就是对于这个service包下面 前后执行的业务类

package org.young.common.aop.aspect;

/**
 * Created by young on 16/10/1.
 */
public interface MQProductAspect {
}
package org.young.common.aop.aspect.impl;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.young.common.aop.aspect.MQProductAspect;

/**
 * Created by young on 16/10/1.
 */
@Aspect
@Component
public class MQProductAspectImpl implements MQProductAspect{

    // 定义一个方法  2016年10月01日22:59:32
    @Pointcut(value = "execution ( * org.young.common.service.*.* (..))")
    public void pointcutMethod(){}

    // 在方法之前执行
    @Before(value = "pointcutMethod()")
    public void beforeMethod(){
        System.out.println("beforeMethod");
    }

    @Around(value = "pointcutMethod()")
    public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        System.out.println("aroundMethod begin");
        Object object = proceedingJoinPoint.proceed();
        System.out.println("aroundMethod end");
        return object;
    }

    @AfterReturning(value = "pointcutMethod()")
    public void afterRetunrningMethod(){
        System.out.println("afterRetunrningMethod ");
    }

    @AfterThrowing(value = "pointcutMethod()")
    public void afterThrowingMethod(){
        System.out.println("afterThrowingMethod ");
    }



    @After(value = "pointcutMethod()")
    public void afterMethod(){
        System.out.println("afterMethod");
    }
}

 

最后写一个类测试一下。

package org.young.common.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.young.common.service.UserService;

/**
 * Created by young on 16/10/1.
 */
public class MQProductAspectTest {

    @Test
    public void test(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring/spring-context.xml");
        UserService userService = (UserService) applicationContext.getBean("userService");
        userService.say("yangzhongren");
    }

}

 

 

 

com.intellij.rt.execution.application.AppMain com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 org.young.common.test.MQProductAspectTest
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
aroundMethod begin
beforeMethod
[UserServiceImpl say] --->>> yangzhongren
aroundMethod end
afterMethod
afterRetunrningMethod 

Process finished with exit code 0

 

完成。

 

所有的代码  我都提交到了  

https://git.oschina.net/yangzhongren/insane.git

 

© 著作权归作者所有

共有 人打赏支持
杨中仁
粉丝 59
博文 36
码字总数 23334
作品 0
南京
程序员
Spring AOP就是这么简单啦

前言 只有光头才能变强 上一篇已经讲解了Spring IOC知识点一网打尽!,这篇主要是讲解Spring的AOP模块~ 之前我已经写过一篇关于AOP的文章了,那篇把比较重要的知识点都讲解过了一篇啦:Sprin...

Java3y ⋅ 05/24 ⋅ 0

IOC/AOP工具 - jBeanBox

jBeanBox是一个微形但功能较齐全的IOC/AOP工具适用于JAVA7+,利用了Java的初始化块实现的Java配置代替XML。jBeanBox采用Apache License 2.0开源协议。 其他一些IOC/AOP框架的问题: 1)Sprin...

yong9981 ⋅ 2016/07/25 ⋅ 14

Spring AOP中自我调用的问题

前几天在做项目的时候同事说,在使用AOP进行拦截的时候发现有些方法有时候能输出拦截的日志有时候不输出拦截的日志。发现在单独调用这些方法的时候是有日志输出,在被同一个类中的方法调用的...

木叶之荣 ⋅ 2017/05/21 ⋅ 0

Spring之使用注解配置Spring AOP

Spring框架通过注解配置AOP是基于AspectJ实现的。 Spring框架只是直接使用了AspectJ的注解,但并没有使用AspectJ的编译器或织入器,仍然是在运行时动态生成AOP代理。 aspectj使用的是静态代理...

Java攻城玩家 ⋅ 05/31 ⋅ 0

@Transaction必知必会

1. Spring事务的基本原理 事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式...

maskwang520 ⋅ 04/15 ⋅ 0

Spring注解事务@Transactional

在声明式事务中我们比较常用的有两种:一种是基于tx和aop命名空间的xml文件。第二种是基于@Transactional的注解。两种都比较常用。前一种只要定义好规范就可以按照规范对方法进行命名。第二种...

u014231523 ⋅ 2017/02/27 ⋅ 0

Spring AOP与拦截器的区别

作用层面 拦截器只对action负责,作用层面一般位于Controller层 Spring AOP主要是拦截对Spring管理的Bean的访问,一般作用与Service层 2、联系与区别 联系: Spring AOP和拦截器一样,都是A...

niithub ⋅ 05/06 ⋅ 0

SpringMVC+Spring事物失效问题

1、spring扫描配置 springmvc扫描配置导致事物失效 一个项目中既有SpringMVC又有Spring 的时候,会发生事物失效问题 原因:使用的spring注解+springMVC注解,默认情况下spring应该先加载appli...

宿小帅 ⋅ 2016/10/12 ⋅ 0

Spring 中常用的两种事务配置方式以及事务的传播性、隔离级别

一、注解式事务 1、注解式事务在平时的开发中使用的挺多,工作的两个公司中看到很多项目使用了这种方式,下面看看具体的配置demo。 2、事务配置实例 (1)、spring+mybatis 事务配置 (2)、...

哲别0 ⋅ 04/20 ⋅ 0

Spring AOP 对Spring MVC的Controller切面拦截不起作用

当使用Spring AOP对Controller层的Controller类的方法进行切面拦截,不起作用。AOP配置没有任何问题。 Spring AOP配置没有任何问题;【正常】 断点调试:Spring源码断点调试,在调用Control...

陶邦仁 ⋅ 2015/11/02 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部