zoukankan      html  css  js  c++  java
  • Spring (Aspect Oriented Programming)的配置

    1、如果对一个对象的方法进行扩充(不改变源码的情况之下,增加或修改行为)的话,一般使用代理模式:

    1. 静态代理(太麻烦,一般不会用)
    2. JDK 的动态代理
    3. CGLib 的动态代理

    2、如果直接写代理生成也麻烦了,所以,基于动态代理,产生了 AOP 的编程思想。这里的*扩充*指的是功能分离,实现解耦

    3、实际中,基于代理实现的 AOP 方案有很多,比如:

    1. AspectJ 实现
    2. Jboss AOP 实现
    3. Spring AOP 实现

    4、Spring AOP

      1、默认的情况下Spring AOP是基于JDK代理的,所以它需要接口。

      2、它也可以调用CGLib的代理方式(如果两个都没有它只能抛异常或报错)

    通知类型

    • 前置通知(Before advice): 在某连接点之前执行的通知,但这个通知不能阻止连接点之前的执行流程(除非它抛出一个异常)
    • 后置通知(After returning advice): 在某连接点正常完成后执行的通知
    • 异常通知(After throwing advice): 在方法抛出异常退出时执行的通知
    • 最终通知(After (finally) advice): 当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
    • 环绕通知(Around Advice): 包围一个连接点的通知,如方法调用

    5、Spring AOP - xml 

      首先我们创建了一Cat(猫)类和一个AnimalConduct(动物行为)类和一个xml文件 ,其次创建一个测试类

      

      AnimalConduct:

        

    package dynamicProxy.instanceXml5;
    
    public class AnimalConduct {
    
        public void start() {
            System.out.println("程序刚刚开始,这只猫不知道要干嘛!");
        }
    
        public void end() {
            System.out.println("程序结束还,这只猫跑不动了");
        }
    }

      Cat:

    package dynamicProxy.instanceXml5;
    
    public class Cat {
        public void to() {
            System.out.println("这是一只猫");
        }
    }

      xml:

    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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <bean id="cat" class="dynamicProxy.instanceXml5.Cat"></bean>
        <bean id="animalConduct" class="dynamicProxy.instanceXml5.AnimalConduct"></bean>
        <!---->
        <!--<aop:aspectj-autoproxy/>-->
        <aop:config>
            <aop:aspect ref="animalConduct">
            <!-- 前置 -->
                 <aop:before method="start" pointcut="execution(* *.*(..))"/>
            </aop:aspect>
        </aop:config>
    
    </beans>

    Test:

    package dynamicProxy.instanceXml5;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Main {
    
        public static void main(String[] args) {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-aop/spring-aop.xml");
            Cat bean = context.getBean(Cat.class);
            bean.to();
    
        }
    }

    运行的结果:

    7、Spring AOP - java 配置

      java配置并不是那么的难,我们在使用java配置的时候一定要注解  " execution(* *.*(..))"  配置包的路径,如果使用星号配置,配置不对了,程序是不会给你个报错的

      Dog类:

     

    package dynamicProxy.instance4.animal;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class Dog {
        public void introduced() {
            System.out.println("社么贵司是否收到");
        }
    }
    

      

    BankManageMent类:

    package dynamicProxy.instance4.bank;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class BankManagement {
    
        public void personnel(int number) {
            System.out.println("银行有多少人:" + number);
        }
    }

    TypeMethod类:

    package dynamicProxy.instance4;
    
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class TypeMethod {
    
    
        @After("execution(void dynamicProxy.instance4.*.*.*(..))")
        public void to() {
            System.out.println("结束做什么事情");
        }
    
        @Before("execution(void dynamicProxy.instance4.animal.Dog.*(..))")
        public void before() {
            System.out.println("开始做什么事情");
        }
    
       // @AfterReturning("execution(public * *.*(..))")
        public void AfterReturning() {
            System.out.println("method AfterReturning");
        }
    }

    如果你是写xml,请在xml 中加上这一句

    <aop:aspectj-autoproxy/>

    如果你是使用java style配置请在容器初始化的开头加上

    Test: 

    package dynamicProxy.instance4;
    
    import com.wgc.persons.spring.SpringDAOConfig;
    import dynamicProxy.instance4.animal.Dog;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class Main {
    
        public static void main(String[] args) {
    
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringDAOConfig.class);
            Dog bean = context.getBean(Dog.class);
            bean.introduced();
        }
    }

    运行的结果:

  • 相关阅读:
    sql 变量赋值
    mysql 行号 获取指定行数据
    SQL Server获取指定行的数据
    sql server 创建内联表值函数
    sql server 表变量存储临时查询数据
    sql server 循环操作
    oracle for in 学习
    oracle C# 访问
    sql server insert values 多值 与oracle 的不同
    mysql 如何选择随机行
  • 原文地址:https://www.cnblogs.com/YouAreABug/p/10139685.html
Copyright © 2011-2022 走看看