星空网 > 软件开发 > Java

Spring中的aop增强

Spring中,目前我学习了几种增强的方式,和大家分享一下

之前的话:

1.AOP  (Aspect  Oriented Programming  面向切面编程)

   在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

面向对象编程是从【静态角度】考虑程序的结构,而面向切面编程是从【动态角度】考虑程序运行过程。
AOP底层,就是采用【动态代理】模式实现的。采用了两种代理:JDK动态代理和CGLIB动态代理。

基本术语(一些名词):
(1)切面(Aspect)
切面泛指[*交叉业务逻辑*]。事务处理和日志处理可以理解为切面。常用的切面有通知(Advice)与顾问(Advisor)。实际就是对主业务逻辑的一种增强。

(2)织入(Weaving)
织入是指将切面代码插入到目标对象的过程。代理的invoke方法完成的工作,可以称为织入。

(3) 连接点(JoinPoint)
连接点是指可以被切面织入的方法。通常业务接口的方法均为连接点

(4)切入点(PointCut)
切入点指切面具体织入的方法
注意:被标记为final的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不能被增强的。

(5)目标对象(Target)
目标对象指将要被增强的对象。即包含主业务逻辑的类的对象。

(6)通知(Advice)
通知是切面的一种实现,可以完成简单的织入功能。通知定义了增强代码切入到目标代码的时间点,是目标方法执行之前执行,还是执行之后执行等。切入点定义切入的位置,通知定义切入的时间。

(7)顾问(Advisor)
顾问是切面的另一种实现,能够将通知以更为复杂的方式织入到目标对象中,是将通知包装为更复杂切面的装配器。

AOP是一种思想,而非实现
AOP是基于OOP,而又远远高于OOP,主要是将主要核心业务和交叉业务分离,交叉业务就是切面。例如,记录日志和开启事务。

一:前置增强和后置增强

Spring中的aop增强

源码介绍:

1.User.java

Spring中的aop增强Spring中的aop增强
package cn.zhang.entity;public class User {  private Integer id; // 用户ID  private String username; // 用户名  private String password; // 密码  private String email; // 电子邮件  public Integer getId() {    return id;  }  public void setId(Integer id) {    this.id = id;  }  public String getUsername() {    return username;  }  public void setUsername(String username) {    this.username = username;  }  public String getPassword() {    return password;  }  public void setPassword(String password) {    this.password = password;  }  public String getEmail() {    return email;  }  public void setEmail(String email) {    this.email = email;  }  }

View Code

2.IDao.java

Spring中的aop增强Spring中的aop增强
package cn.zhang.dao;//定义接口import cn.zhang.entity.User;public interface IDao {  //定义方法  public void save(User user);}

View Code

3.UserDao.java

Spring中的aop增强Spring中的aop增强
package cn.zhang.dao.impl;//实现接口import cn.zhang.dao.IDao;import cn.zhang.entity.User;public class UserDao implements IDao {  @Override  //实现方法  public void save(User user) {    System.out.println("save success!");      }}

View Code

4.IUserBiz.java

Spring中的aop增强Spring中的aop增强
package cn.zhang.biz;//业务接口import cn.zhang.entity.User;public interface IUserBiz {  //待处理的方法   public void save(User user);}

View Code

5.UserBiz.java

Spring中的aop增强Spring中的aop增强
package cn.zhang.biz.impl;//业务接口的实现类import cn.zhang.biz.IUserBiz;import cn.zhang.dao.IDao;import cn.zhang.entity.User;public class UserBiz implements IUserBiz {  //引入IDao接口  private IDao dao;  @Override  //实现方法  public void save(User user) {    dao.save(user);  }  //dao 属性的setter访问器,会被Spring调用,实现设值注入  public IDao getDao() {    return dao;  }  public void setDao(IDao dao) {    this.dao = dao;  }}

View Code

6.LoggerAfter.java(后置增强)

Spring中的aop增强Spring中的aop增强
package cn.zhang.aop;//后置增强import java.lang.reflect.Method;import org.springframework.aop.AfterReturningAdvice;public class LoggerAfter implements AfterReturningAdvice {  @Override  public void afterReturning(Object arg0, Method arg1, Object[] arg2,      Object arg3) throws Throwable {      System.out.println("后置增强代码");      }}

View Code

7.LoggerBefore.java(前置增强)

Spring中的aop增强Spring中的aop增强
package cn.zhang.aop;//前置增强import java.lang.reflect.Method;import org.apache.log4j.Logger;import org.springframework.aop.MethodBeforeAdvice;public class LoggerBefore implements MethodBeforeAdvice {  private static final Logger log = Logger.getLogger(LoggerBefore.class);  @Override  public void before(Method arg0, Object[] arg1, Object arg2)      throws Throwable {    log.info("前置内容AAA");      System.out.println("前置增强代码");  }}

View Code

8.applicationContext.Spring中的aop增强Spring中的aop增强

<??><beans ="http://www.springframework.org/schema/beans"  ="http://www.w3.org/2001/ ="http://www.springframework.org/schema/aop"  ="http://www.springframework.org/schema/p"  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-4.1.xsd    ">  <bean id="dao" class="cn.zhang.dao.impl.UserDao" />  <bean id="biz" class="cn.zhang.biz.impl.UserBiz">    <property name="dao" ref="dao"></property>  </bean>  <!-- 定义前置增强组件 -->  <bean id="loggerBefore" class="cn.zhang.aop.LoggerBefore" />  <!-- 定义后置增强组件 -->  <bean id="loggerAfter" class="cn.zhang.aop.LoggerAfter" />  <!-- 针对AOP的配置 -->  <aop:config>    <aop:pointcut id="pointcut"      expression="execution(public void save(cn.zhang.entity.User))" />    <!-- 将增强处理和切入点结合在一起,在切入点处插入增强处理,完成"织入" -->    <aop:advisor pointcut-ref="pointcut" advice-ref="loggerBefore" />    <aop:advisor pointcut-ref="pointcut" advice-ref="loggerAfter" />  </aop:config></beans> 

View Code

9.MyTest.java

Spring中的aop增强Spring中的aop增强
package cn.zhang.test;//测试类import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathimport cn.zhang.biz.IUserBiz;import cn.zhang.entity.User;public class MyTest {public static void main(String[] args) {    ApplicationContext ctx = new ClassPath);  IUserBiz biz=(IUserBiz)ctx.getBean("biz");  User user=new User();  biz.save(user);  System.out.println("success!");}}

View Code

10.log4j.properties(日志的配置文件)

Spring中的aop增强Spring中的aop增强
### direct log messages to stdout ###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### direct messages to file mylog.log ###log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=c\:mylog.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### set log levels - for more verbose logging change 'info' to 'debug' ###log4j.rootLogger=info, stdout

View Code

当然,别忘了引入我们需要的jar包啊!

常用的jar:

Spring中的aop增强

 

二:异常抛出增强和环绕增强

Spring中的aop增强

源码介绍:

1.User.java

Spring中的aop增强Spring中的aop增强
package cn.zhang.entity;public class User {  private Integer id; // 用户ID  private String username; // 用户名  private String password; // 密码  private String email; // 电子邮件      public User() {    super();    // TODO Auto-generated constructor stub  }    public User(Integer id, String username, String password, String email) {    super();    this.id = id;    this.username = username;    this.password = password;    this.email = email;  }  public Integer getId() {    return id;  }  public void setId(Integer id) {    this.id = id;  }  public String getUsername() {    return username;  }  public void setUsername(String username) {    this.username = username;  }  public String getPassword() {    return password;  }  public void setPassword(String password) {    this.password = password;  }  public String getEmail() {    return email;  }  public void setEmail(String email) {    this.email = email;  }  }

View Code

2.UserService.java

Spring中的aop增强Spring中的aop增强
package cn.zhang.service;public class UserService {  public void delete() {    //int i = 5 / 0;//制造一个错误,用于测试异常抛出增强    System.out.println("delete success!");  }}

View Code

3.ErrorLog.java(异常抛出增强)

Spring中的aop增强Spring中的aop增强
package cn.zhang.aop;//异常抛出增强import java.lang.reflect.Method;import org.apache.log4j.Logger;import org.springframework.aop.ThrowsAdvice;public class ErrorLog implements ThrowsAdvice {  private static final Logger log = Logger.getLogger(ErrorLog.class);  public void afterThrowing(Method method, Object[] args, Object target,      RuntimeException e){    log.error(method.getName() + " 方法发生异常:" + e);  }}

View Code

4.AroundLog(环绕增强)

Spring中的aop增强Spring中的aop增强
package cn.zhang.aop;//环绕增强import java.lang.reflect.Method;import java.util.Arrays;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;import org.apache.log4j.Logger;public class AroundLog implements MethodInterceptor {    private static final Logger log = Logger.getLogger(AroundLog.class);  @Override  public Object invoke(MethodInvocation invocation) throws Throwable {      Object target=invocation.getThis();//获取被代理对象    Method method = invocation.getMethod();//获得被代理方法    Object[] args = invocation.getArguments();//获得方法参数        System.out.println("调用"+target+"的"+method.getName()+"方法。方法参数:"+Arrays.toString(args));    Object result;//调用目标方法,获取目标方法返回值    try {      result = invocation.proceed();      System.out.println("调用" + target + "的" + method.getName()          + "方法。方法返回值:" + result);      return result;    } catch (Exception e) {      log.error(method.getName()+"方法发生异常:"+e);      throw e;    }      }}

View Code

5.applicationContext.Spring中的aop增强Spring中的aop增强

<??><beans ="http://www.springframework.org/schema/beans"  ="http://www.w3.org/2001/   ="http://www.springframework.org/schema/aop"  ="http://www.springframework.org/schema/p"  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-4.1.xsd    ">  <bean id="service" class="cn.zhang.service.UserService" />  <!-- 异常抛出增强 -->  <!-- <bean id="error" /> -->  <!-- 环绕增强 -->  <bean id="error" class="cn.zhang.aop.AroundLog"/>    <aop:config>    <aop:pointcut expression="execution(public void delete())"      id="pointcut" />    <aop:advisor advice-ref="error" pointcut-ref="pointcut" />  </aop:config></beans> 

View Code

6.MyTest.java

Spring中的aop增强Spring中的aop增强
package cn.zhang.test;//测试类import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathimport cn.zhang.service.UserService;public class MyTest {  public static void main(String[] args) {        ApplicationContext ctx = new ClassPath"applicationContext.);    UserService service = (UserService) ctx.getBean("service");    try {      service.delete();    } catch (Exception e) {      System.out.println("错误了");    }    System.out.println("success!");  }}

View Code

三:注解增强方式实现前置增强和后置增强

Spring中的aop增强

源码介绍:

1.UserService.java

Spring中的aop增强Spring中的aop增强
package cn.service;//业务处理类public class UserService {  //方法  public void delete() {    System.out.println("delete success!");  }}

View Code

2.AnnotationAdvice.java(注解增强)

Spring中的aop增强Spring中的aop增强
package cn.aop;//注解增强import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;@Aspectpublic class AnnotationAdvice {    // 定义前置增强  @Before("execution(* cn.service.UserService.*(..))")  public void before(JoinPoint jp) {    System.out.println("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法,参数:"+jp.getArgs()+",参数个数:"+jp.getArgs().length);    System.out.println("before");  }  // 定义后置增强  @AfterReturning(pointcut="execution(* cn.service.UserService.*(..))",returning="returnValue")  public void afterReturning(JoinPoint jp,Object returnValue) {     System.out.println("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法,参数:"+jp.getArgs()+",返回值为:"+returnValue);    System.out.println("after");  }}

View Code

注:

java.lang.Object[] getArgs():获取连接点方法运行时的入参列表
Signature getSignature() :获取连接点的方法签名对象
java.lang.Object getTarget() :获取连接点所在的目标对象
java.lang.Object getThis() :获取代理对象本身

3.applicationContext.Spring中的aop增强Spring中的aop增强

<?  ="http://www.w3.org/2001/  ="http://www.springframework.org/schema/p"  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-4.1.xsd    ">      <bean id="service" class="cn.service.UserService" />  <bean id="error" class="cn.aop.AnnotationAdvice" />  <!-- 针对AOP的配置 -->  <aop:aspectj-autoproxy /></beans> 

View Code

4.MyTest.java

Spring中的aop增强Spring中的aop增强
package cn.test;//注解增强测试import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathimport cn.service.UserService;public class MyTest {  public static void main(String[] args) {    ApplicationContext ctx = new ClassPath);    UserService biz=(UserService)ctx.getBean("service");    biz.delete();    System.out.println("success!");  }}

View Code

 




原标题:Spring中的aop增强

关键词:Spring

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

洛杉矶冰雹来袭!西班牙、日本遭暴风雪突击,多国物流延误...:https://www.ikjzd.com/articles/141483
FBA vs FBM 哪个更适合你?:https://www.ikjzd.com/articles/141484
营销要趁早!2021年情人节该如何营销?:https://www.ikjzd.com/articles/141485
卖家做独立站关心的问题(六):https://www.ikjzd.com/articles/141486
干货!亚马逊品牌授权常见问题解析,内附详细授权流程!:https://www.ikjzd.com/articles/141487
跨境电商如何打破东南亚物流的“三关”?:https://www.ikjzd.com/articles/141488
大批Listing被下架,“黄色警告”!提示存在停用风险:https://www.kjdsnews.com/a/1836647.html
跨境支付百科——巴西支付篇:https://www.kjdsnews.com/a/1836648.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流