Spring AOP全自动编程

1、AOP概述

1) AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

2)AOP是OOP(面向对象编程的)一种延续,是Spring框架中的一个重要内容

3)利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高了代码的可重用性,同时也提高了代码的效率

4)AOP采取了横向抽取机制,取代了传统纵向继承的重复性代码

5)AspectJ是一个基于java语言的AOP框架,它提供了一个专门的编译器,在编译时提供横向代码的织入、

2、AOP术语

1.target目标类,需要被代理的类。例如:UserService

2.Joinpoint(连接点):所谓连接点是指那些可能被拦截到的方法。例如:所有的方法

3.PointCut 切入点:已经被增强的连接点。例如:addUser()

4.advice 通知/增强增强代码。例如:after、before

5. Weaving(织入):是指把增强advice应用到目标对象target来创建新的代理对象proxy的过程.

6.proxy 代理类

7. Aspect(切面): 是切入点pointcut和通知advice的结合

         一个线是一个特殊的面。

         一个切入点和一个通知,组成成一个特殊的面。

 

实现AOP编程有3种方式,分别为手动代理、Spring半自动代理、Spring AOP全自动编程,这里只介绍spring AOP全自动编程

首先,导入用到的包

Spring中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: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.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">

    <!--配置UserService-->
    <!--业务类,目标类-->
    <bean id="userService" class="oyb.service.UserServiceImpl"></bean>

    <!--默认情况下Spring的AOP生成的代理是JDK的Proxy实现的-->
    <!--配置切面对象  切面类-->
    <bean id="myAspect" class="oyb.service.MyAspect"></bean>

    <!--全自动AOP配置
    1.在bean中配置aop约束
    2.配置aop:config内容,把切入点和通知结合
    expression 表达式 : *任意
            execution(*      oyb.service.*.   *      (..))
                    返回值   包名      类名 方法名  参数

    -->
    <aop:config proxy-target-class="true">
        <!--切入点
            expression:表达式
            每个service的方法前后都开启事务和结束事务

            AOP:用于事务配置&日志记录
        -->
        <aop:pointcut id="myPointcut" expression="execution(* oyb.service.*.*(..))"></aop:pointcut>
        <!--通知 关联 切入点-->
        <aop:advisor advice-ref="myAspect" pointcut-ref="myPointcut"></aop:advisor>
    </aop:config>

</beans>

切面类:

package oyb.service;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

/**
 * 切面类:增强的代码与切入点的结合
 */
public class MyAspect implements MethodInterceptor{


    @Override
    public Object invoke(MethodInvocation mi) throws Throwable {
        //拦截方法

        System.out.println("开启事务");
        //放行
        Object retObj = mi.proceed();

        System.out.println("拦截");

        System.out.println("提交事务");
        return retObj;
    }
}

UserService接口中

package oyb.service;

import oyb.model.Student;
import oyb.model.User;

public interface UserService {//切面编程
    public void addUser();
    public void updateUser();
    public void deleteUser();
    public int deleteUser(int id);
}

UserServiceImpl的代码

package oyb.service;import org.springframework.stereotype.Service;import oyb.model.User;

@Service("myUserService")

public class UserServiceImpl implements UserService {
    
    @Override
    public void addUser() {
        System.out.println("添加用户。。。");
    }

    @Override
    public void updateUser() {
        System.out.println("更新用户。。。");
    }

    @Override
    public void deleteUser() {
        System.out.println("删除用户。。。");
    }

    @Override
    public int deleteUser(int id) {
        System.out.println("通过id删除用户");
        return 1;
    }
}

测试部分的代码:

package oyb.test;

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

public class Demo {

    @Test
    public void test1() throws  Exception{

       //获取Spring容器中代理对象
        ApplicationContext context = new ClassPathXmlApplicationContext("beans08.xml");

        IUserService userService = (IUserService) context.getBean("userService");

        userService.deleteUser();

    }
}

 

posted @ 2019-03-16 22:17  微命  阅读(229)  评论(0)    收藏  举报