• Spring常见的两种增强方式


    一、编程式增强

      不借助spring的配置,通过自己实例化对象来实现的增强方式

    创建增强类,需要实现你需要的增强接口,(只有实现了该接口,这个类就是一个通知))

     1 /**
     2  * 增强类
     3  */
     4 public class Advice implements MethodBeforeAdvice, AfterReturningAdvice {
     5     @Override
     6     public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
     7         System.out.println("我是后置增强");
     8     }
     9 
    10     @Override
    11     public void before(Method method, Object[] objects, Object o) throws Throwable {
    12         System.out.println("我是前置增强");
    13     }
    14 }

    创建接口定义一个dosome方法

    public interface DoSome {
        void dosome();
    }

    创建接口的上诉接口的实现类DoSomeImpl在控制台输出一句话

    public class DoSomeImpl implements DoSome{
        public void dosome(){
            System.out.println("我是service层");
        }
    }

    创建测试类

    public class Dome {
        public static void main(String[] args) {
            //获取代理工厂
            ProxyFactory pf = new ProxyFactory();
            //将实现类set进去
            pf.setTarget(new DoSomeImpl());
            //将通知类减价进去
            pf.addAdvice(new Advice());
            //通过代理工厂获取对象的实例
            DoSome ds =(DoSome) pf.getProxy();
            ds.dosome();//执行方法
        }
    }

    以上就是编程式增强的简单实现,可见编程式增强配置性很差,而且有spring为什么不用,辣么方便

    二、声明式增强

      利用spring的ioc机制为ProxyFactory进行注入,这样可配置性就高了许多,毕竟项目大了,在很多个.java文件中去找几个ProxyFactory式很困难的,如果只是找配置文件的话就舒服多了。废话不多说了,上代码了(由于通知和service层代码与编程时增强相同,这里就不重复写了只写配置文件和测试类)

    配置文件applicationContext.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--创建service层的bean-->
        <bean id="service" class="service.DoSomeImpl"></bean>
        <!--创建通知的bean-->
        <bean id="advice" class="advice.Advice"></bean>
        <!--创建代理工厂bean,并注入属性-->
        <bean id="factoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
            <!--注入service实现类的bean-->
            <property name="target" ref="service"/>
            <!--注入通知的bean,注意这里不使用ref注入,只能是value属性,属性为通知类bean的id属性-->
            <property name="interceptorNames" value="advice"/>
        </bean>
    </beans>

     测试类改写为

    1 public class Dome {
    2     public static void main(String[] args) {
    3         ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
    4         DoSome proxyFactory = (DoSome) context.getBean("factoryBean");//这里注入的是ProxyFactoryBean的id属性值
    5         proxyFactory.dosome();
    6     }
    7 }

    了解动态代理的大佬应该看的出,这里都是借助动态代理。说白了,动态代理就是spring的大脑,没了动态代理,spring就不是spring了

  • 相关阅读:
    Android 利用WebViewJavascriptBridge 实现js和java的交互(一)
    iOS-APP-Icon 图标启动图及名字的设置
    IOS应用在ios7(iPhone5/iPhone5s)上不能全屏显示
    给iOS项目中添加图片,并通过UIImageView引用和显示该UIImage图片
    IOS打包发布APP的所有详细流程
    Android 利用Gson生成或解析json
    Android 将HTML5封装成android应用APK文件的几种方法
    Android webview 运行时不调用系统自带浏览器
    Android WebView页面加载优化
    Excel 2013数据挖掘工具栏的介绍(二)
  • 原文地址:https://www.cnblogs.com/Tiandaochouqin1/p/10434118.html
Copyright © 2020-2023  润新知