Spring常见的两种增强方式
一、编程式增强
不借助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常见的两种增强方式的更多相关文章
- (一)spring aop的两种配置方式。
sring aop的方式有两种:(1)xml文件配置方式(2)注解的方式实现,我们可以先通过一个demo认识spring aop的实现,然后再对其进行详细的解释. 一.基于注解的springAop配置 ...
- Spring定时器的两种实现方式
有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz. 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 imp ...
- spring AOP的两种配置方式
连接点(JoinPoint) ,就是spring允许你是通知(Advice)的地方,那可就真多了,基本每个方法的前.后(两者都有也行),或抛出异常是时都可以是连接点,spring只支持方法连接点.其他 ...
- Spring与Hibernate两种组合方式
第一种 1.hibernate.cfg.xml文件 xml version='1.0' encoding='utf-8'?> "-//Hibernate/Hibernate Confi ...
- spring ----> aop的两种实现方式
实现1:基于xml package com.rr.spring3.interf; //接口 public interface SayHello { public void sayHello(); } ...
- 实例化Spring容器的两种常用方式
//在类路径下寻找配置文件来实例化容器 ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"b ...
- Spring管理事物两种方式
Spring管理事物两种方式 1. 编程式事物管理(在开发中不经常使用) 使用步骤 1. 配置数据库事物管理 DataSourceTransactionManager <!--配置事物管理器-- ...
- SpringBoot读取.yml配置文件最常见的两种方式-源码及其在nacos的应用
一.前言 我们在开发中会经常遇到一些可能会变的值,比如数据库的密码,一些关键链接的配置等等. 都需要我们写在配置文件中,这样可以把这些配置文件放到nacos上进行管理,修改nacos的配置,咱们发布的 ...
- struts2+spring的两种整合方式
也许有些人会因为学习了struts1,会以为struts2.struts1与spring的整合也是一样的,其实这两者相差甚远.下面就来讲解一下struts2与spring的整合两种方案.(部分转载,里 ...
随机推荐
- openv uMat和Mat数据格式的转换
Mat 转成 UMat: UMat umat; mat.copyTo(umat); UMat转成 Mat : Mat mat; umat.copyTo(mat);
- 详细的git入门级别,从安装到实战
拥有自己码云开源网站,想要上传项目到码云怎么操作?公司新技术提升由Svn转为Git,慌不慌?想要从Github开源网站下载开源项目,难道还依赖直接下载项目然后解压导入项目工程?下面可以通过及其简易且好 ...
- [CF百场计划]Codeforces Round #617 (Div. 3)
A. Array with Odd Sum Description You are given an array \(a\) consisting of \(n\) integers. In one ...
- centos挂载磁盘
Aliyun实例为例 简单操作: 查看磁盘情况:fdisk -l 对数据盘进行分区,一般类似/dev/vdb这种为数据盘 输入fdisk /dev/vdb 对数据盘进行分区.根据提示,输入 n, p ...
- JDK的安装与环境变量配置
1.下载JDK后安装,此处安装的是JDK8 2.安装后的路径如下图所示,JDK与JRE在同一个文件夹中 3.安装完JDK后配置环境变量 计算机→属性→高级系统设置→高级→环境变量 4.系统变量→新建 ...
- CMS-熊海网站内容管理系统漏洞测试
开门见山 在虚拟机中搭建网站,本机访问http://192.168.31.68/ 一.SQL注入获取管理员账号密码 1. 点开一篇文章,存在get请求参数 2. 手工注入无果,使用sqlmap,后跟- ...
- 清除input表单内容
碰到几次情况,页面刷新或者从上级页面返回表单的内容依然遗留,很影响使用. <form action="" method="" autocomplete=& ...
- [原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?
原调试debugwindbghangprocess explorer 前言 如果我们自己的程序的CPU Usage(CPU占用率)飙升,并且居高不下,很有可能陷入了死循环.你知道怎么快速定位并解决吗? ...
- ubuntu19.10安装cuda-10.1
ubuntu19.10安装cuda-10.1 1.安装N卡驱动: 打开ubuntu的软件和更新,设置N卡驱动 2.查看ubuntu显卡驱动 nvidia-smi 显示: Sun Feb 23 06:4 ...
- 题解【[BJOI2015]树的同构】
切了省选题+紫题,来写个题解 这题其实挺水,才120行代码 该题写了我一天(上午1.5h,晚上10min = 一天) hash,对于节点A,\[hashval[A] = \{hashval[i]\ti ...