一、编程式增强

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

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

 /**
* 增强类
*/
public class Advice implements MethodBeforeAdvice, AfterReturningAdvice {
@Override
public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
System.out.println("我是后置增强");
} @Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("我是前置增强");
}
}

创建接口定义一个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>

测试类改写为

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

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

Spring常见的两种增强方式的更多相关文章

  1. (一)spring aop的两种配置方式。

    sring aop的方式有两种:(1)xml文件配置方式(2)注解的方式实现,我们可以先通过一个demo认识spring aop的实现,然后再对其进行详细的解释. 一.基于注解的springAop配置 ...

  2. Spring定时器的两种实现方式

    有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz. 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 imp ...

  3. spring AOP的两种配置方式

    连接点(JoinPoint) ,就是spring允许你是通知(Advice)的地方,那可就真多了,基本每个方法的前.后(两者都有也行),或抛出异常是时都可以是连接点,spring只支持方法连接点.其他 ...

  4. Spring与Hibernate两种组合方式

    第一种 1.hibernate.cfg.xml文件 xml version='1.0' encoding='utf-8'?> "-//Hibernate/Hibernate Confi ...

  5. spring ----> aop的两种实现方式

    实现1:基于xml package com.rr.spring3.interf; //接口 public interface SayHello { public void sayHello(); } ...

  6. 实例化Spring容器的两种常用方式

    //在类路径下寻找配置文件来实例化容器 ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"b ...

  7. Spring管理事物两种方式

    Spring管理事物两种方式 1. 编程式事物管理(在开发中不经常使用) 使用步骤 1. 配置数据库事物管理 DataSourceTransactionManager <!--配置事物管理器-- ...

  8. SpringBoot读取.yml配置文件最常见的两种方式-源码及其在nacos的应用

    一.前言 我们在开发中会经常遇到一些可能会变的值,比如数据库的密码,一些关键链接的配置等等. 都需要我们写在配置文件中,这样可以把这些配置文件放到nacos上进行管理,修改nacos的配置,咱们发布的 ...

  9. struts2+spring的两种整合方式

    也许有些人会因为学习了struts1,会以为struts2.struts1与spring的整合也是一样的,其实这两者相差甚远.下面就来讲解一下struts2与spring的整合两种方案.(部分转载,里 ...

随机推荐

  1. PROOF|ADOBE READER

    样稿PROOF,最后是印刷样张. 修改校样是最后一次修改错误. 每一版editor不一样,任务不同. 不能修改工作单位,但是可以加一个标注. 最好使用ADOBE READER中的COMMENT& ...

  2. 一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性

    自定义异常类:FormattedDbEntityValidationException public class FormattedDbEntityValidationException : Exce ...

  3. Python说文解字_杂谈03

    1. 我们从前面的知识得到,所有的类都要继承自object这个基类(超类),另外我们知道“继承”可以继承类的属性和方法.我们起始通过type创建类的时候,自然而然的也会从ojbect继承他的一些属性和 ...

  4. struct stat

    stat函数用来获取指定路径的文件或者文件夹的信息. //! 需要包含的头文件 #include <sys/types.h> #include <sys/stat.h> //函 ...

  5. 使用IDEA搭建SSM,小白教程

    本片博客主要是搭建一个简单的SSM框架,感兴趣的同学可以看一下 搭建ssm框架首先我们需要有一个数据库,本篇文章博主将使用一个MySQL的数据,如果没学过MySQL数据库的,学过其他数据库也是可以的 ...

  6. 吴裕雄--天生自然 JAVA开发学习:修饰符

    public class InstanceCounter { private static int numInstances = 0; protected static int getCount() ...

  7. [原]排错实战——解救加载调试符号失败的IDA

    原调试IDA排错troubleshootsymbolspdbsysinternalprocess monitor 缘起 最近想借助IDA逆向一个函数.在windows下,调试器(比如vs, windb ...

  8. 01.Java安装及环境变量的设置

    1.下载 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.mac上安装及配 ...

  9. Python笔记_第三篇_面向对象_1.面向对象的基本概念和作用域

    1. 软件编程的实质: 软件编程就是将我们的思维转变成计算机能够识别语言的一个过程.重要的是思想,代码技术反而次要.因此思想也是最难的,突破固定的思想是关键 2. 什么是面向过程: * 自上而下顺序执 ...

  10. docker可视化工具

    介绍两款Docker可视化工具 DockerUI(特点:轻量) 下载镜像 docker pull abh1nav/dockerui 启动容器 docker run -d --privileged -- ...