Java学习路线-58:AOP面向切面编程
发布日期:2021-07-01 06:11:33 浏览次数:2 分类:技术文章

本文共 3993 字,大约阅读时间需要 13 分钟。

AOP 面向切面编程

AOP aspect oriented programming

OOP Object oriented programming

  1. 提供申明式服务
  2. 允许用户实现自定义切面

传统编程模式

自上而下,纵向的编程

Jsp    ->Action    ->Service    ->Dao

AOP 编程:

在不改变原有的代码,增加新的功能

Jsp    ->Action    ->Service  <- log()    ->Dao

好处:

  1. 使得真实角色处理业务更加纯粹,不再关注公共的问题
  2. 公共业务由代理类完成,实现业务的分工
  3. 公共业务发生扩展时变得更加集中和方便

关注点:日志,安全,缓存,事务

切面 Aspect:一个关注点的模块化

实现 AOP

1、通过 Spring 接口实现

依赖

org.aspectj
aspectjweaver
1.9.5
package com.spring.service;public interface UserService {
public void add(); public void delete();}
package com.spring.service.impl;import com.spring.service.UserService;public class UserServiceImpl implements UserService {
@Override public void add() {
System.out.println("add"); } @Override public void delete() {
System.out.println("delete"); }}
package com.spring.aop;import org.springframework.aop.MethodBeforeAdvice;import java.lang.reflect.Method;// 前置通知public class BeforeLog implements MethodBeforeAdvice {
@Override public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println(target.getClass().getName() + ": "+ method.getName()); }}
package com.spring.aop;import org.springframework.aop.AfterReturningAdvice;import java.lang.reflect.Method;// 后置通知public class AfterLog implements AfterReturningAdvice {
@Override public void afterReturning( Object result, Method method, Object[] objects, Object target) throws Throwable {
System.out.println(target.getClass().getName() + ": "+ method.getName()); }}
package com.spring.test;import com.spring.service.UserService;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Demo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); UserService service = (UserService) context.getBean("service"); service.add(); service.delete(); }}

执行结果

com.spring.service.impl.UserServiceImpl: addaddcom.spring.service.impl.UserServiceImpl: addcom.spring.service.impl.UserServiceImpl: deletedeletecom.spring.service.impl.UserServiceImpl: delete

Spring AOP 本质

就是讲公共的业务(如日期,安全等)和领域业务结合,

当执行领域业务时将会把公共业务加进来,
实现公共业务的重复利用,
领域业务更纯粹,可以专注于领域业务,
本质是动态代理

2、自定义类实现 AOP

UserService、UserServiceImpl、Demo 三个类不变

添加 Log 类和修改配置文件

package com.spring.aop;public class Log {
public void before(){
System.out.println("--before--"); } public void after(){
System.out.println("--after--"); }}

执行结果

--before--add--after----before--delete--after--

3、注解实现 AOP

业务类不改变

package com.spring.aop;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;@Aspectpublic class Log {
@Before("execution(* com.spring.service.impl.UserServiceImpl.* (..))") public void before(){
System.out.println("--before--"); } @After("execution(* com.spring.service.impl.UserServiceImpl.* (..))") public void after(){
System.out.println("--after--"); } @Around("execution(* com.spring.service.impl.UserServiceImpl.* (..))") public Object Around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("--Around before--"); Object result = pjp.proceed(); System.out.println("--Around after--"); return result; }}

执行结果

--Around before----before--add--Around after----after----Around before----before--delete--Around after----after--

总结

公共业务:

日志,安全,权限,缓存,事务

分离思想

在不改变原有代码的情况下,增加额外的功能

转载地址:https://pengshiyu.blog.csdn.net/article/details/106889187 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java学习路线-59:MyBatis数据持久层框架
下一篇:Java学习路线-57:静态代理和动态代理

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月15日 16时19分31秒