一、引出问题
有个接口TestServiceInter,有两个实现方法TestService和Test2Service。他们都有sayHello();我们的需求是在调用这两个方法之前,要先完成写日志的功能;
二、菜鸟的想法
我在各个实现类的sayHello()方法里面写上写日志的功能就是了。
这样实现存在的问题:代码冗余。当所有实现类都要加上日志功能的时候,需要写很多重复代码
三、利用AOP前置通知实现此功能
3.1 第一步:我们需要定义一个接口
package com.jdc.aop;
/**
@author DEllComputer
@Title: TestService
@ProjectName SpringAop
@Description:
-
@date 2018/12/251:38 PM
*/
public interface TestService {/**
* @Description:
* @param ${tags}
* @return ${return_type}
* @throws
* @author jdc
* @date 2018/12/25 1:39 PM
*/
void sayHi(String name);
}
3.2 第二步:实现接口public class www.dasheng178.com TestServiceImpl implements TestService {
private String name;
/**
* @Description: say hi
* @param ${tags}
* @return ${return_www.dongfan178.com type}
* @throws
* @author jdc
* @date 2018/12/25 1:40 PM
*/
@Override
public void sayHi(String name ) {
System.out.println(“hi:”www.gouyiflb.cn + name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}3.3 第三步:实现前置通知(AOP中通知的概念就是实现增强代码逻辑的,比如这里的记录日志)
/**
@author DEllComputer
@Title: MyBeforeAdvice
@ProjectName SpringAop
@Description: 写日志前置通知
-
@date 2018/12/251:42 PM
*/
public class MyBeforeAdvice www.ysyl157.com implements MethodBeforeAdvice {/**
* @Description: 写日志的功能
* @param ${tags}
* @return ${return_type}
* @throws
* @author jdc
* @date 2018/12/25 1:44 PM
*/
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println(“我是写日志的功能。”);
}
}前置通知需要实现MethodBeforeAdvice接口,前置通知是在目标方法调用之前调用;3.4 第四步:在Spring的配置文件中配置代理对象,通知,目标对象<?xml version="1.0" encoding="UTF-8"?>com.jdc.aop.TestServic
<!-- 把通知织入代理对象 --> <property name="interceptorNames"> <value>myBeforeAdvice<www.michenggw.com /value> </property> <!-- 配置被代理的对象 --> <property name="target" ref="logTestServiceImpl"/>
ProxyFactoryBean是一个代理对象,如果我们被代理的对象实现了接口,[Spring](https://www.itjmd.com/news/show-4314.html)使用的是jdk动态代理技术实现的动态代理;所以我们要告诉代理对象,我们的哪些接口需要被代理,然后哪个对象需要被代理,我的增强实现应该怎么被织入到代理对象(前置,后置,环绕....)3.5 第五步:写测试代码测试 public class TestMain {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
//获取代理对象
TestService log = (www.gcyL157.com TestService) ac.getBean("proxyFactoryBean");
log.sayHi("哈哈");