AOP的实现原理与应用场景

Spring AOP的实现原理与应用场景

作用:在不修改源代码的情况下,可以实现功能的增强。

传统的纵向体系代码复用:
《AOP的实现原理与应用场景》

横向抽取机制(AOP思想):
《AOP的实现原理与应用场景》
AOP 思想: 基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,通过代理对象,调用增强功能的代码,从而对原有业务方法进行增强 !

AOP应用场景

AOP用来封装横切关注点,具体可以在下面的场景中使用

Authentication 权限

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading 懒加载

Debugging 调试

logging, tracing, profiling and monitoring 记录跟踪 优化 校准

Performance optimization 性能优化

Persistence 持久化

Resource pooling 资源池

Synchronization 同步

Transactions 事务

AOP的实现原理

那Spring中AOP是怎么实现的呢?Spring中AOP的有两种实现方式:
1、JDK动态代理
2、Cglib动态代理

JDK动态代理

1.引入依赖,有spring,单元测,日志管理

<dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>

        <!-- 单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- 日志 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
       

2.UserDao接口

public interface UserDao {
    public void saveUser();
}

 
 

    3.UserDao实现类

    public class UserDaoImpl implements UserDao {
    
        @Override
        public void saveUser() {
            System.out.println("持久层:用户保存");
        }
    }
     
     

      4.动态代理

      @Test
          public void test1() {
      
              final UserDao userDao = new UserDaoImpl();
              // newProxyInstance的三个参数解释:
              // 参数1:代理类的类加载器,同目标类的类加载器
              // 参数2:代理类要实现的接口列表,同目标类实现的接口列表
              // 参数3:回调,是一个InvocationHandler接口的实现对象,当调用代理对象的方法时,执行的是回调中的invoke方法
              //proxy为代理对象
              UserDao proxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
                      userDao.getClass().getInterfaces(), new InvocationHandler() {
      
                          @Override
                          // 参数proxy:被代理的对象
                          // 参数method:执行的方法,代理对象执行哪个方法,method就是哪个方法
                          // 参数args:执行方法的参数
                          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                              System.out.println("记录日志");
                              Object result = method.invoke(userDao, args);
                              return result;
                          }
                      });
              //代理对象执行方法
              proxy.saveUser();
          }
       
       

        5.结果
        在没有修改原有类的代码的情况下,对原有类的功能进行了增强
        《AOP的实现原理与应用场景》

        Cglib动态代理

        在实际开发中,可能需要对没有实现接口的类增强,用JDK动态代理的方式就没法实现。采用Cglib动态代理可以对没有实现接口的类产生代理,实际上是生成了目标类的子类来增强。
         首先,需要导入Cglib所需的jar包。提示:spring已经集成了cglib,我们已经导入了spring包,所以不需要再导入其它包了。
        1.创建LinkManDao类,没有实现任何接口

        public class LinkManDao {
            public void save(){
                System.out.println("持久层:联系人保存....");
            }
        }
         
         

          2.动态代理

          @Test
              public void test2() {
                  final LinkManDao linkManDao = new LinkManDao();
                  // 创建cglib核心对象
                  Enhancer enhancer = new Enhancer();
                  // 设置父类
                  enhancer.setSuperclass(linkManDao.getClass());
                  // 设置回调
                  enhancer.setCallback(new MethodInterceptor() {
                      /** * 当你调用目标方法时,实质上是调用该方法 * intercept四个参数: * proxy:代理对象 * method:目标方法 * args:目标方法的形参 * methodProxy:代理方法 */
                      @Override
                      public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
                              throws Throwable {
                          System.out.println("记录日志");
                           Object result = method.invoke(linkManDao, args);
                          return result;
                      }
                  });
                  // 创建代理对象
                  LinkManDao proxy = (LinkManDao) enhancer.create();
                  proxy.save();
              }
           
           

            3.结果
            《AOP的实现原理与应用场景》

            				<script>
            					(function(){
            						function setArticleH(btnReadmore,posi){
            							var winH = $(window).height();
            							var articleBox = $("div.article_content");
            							var artH = articleBox.height();
            							if(artH > winH*posi){
            								articleBox.css({
            									'height':winH*posi+'px',
            									'overflow':'hidden'
            								})
            								btnReadmore.click(function(){
            									articleBox.removeAttr("style");
            									$(this).parent().remove();
            								})
            							}else{
            								btnReadmore.parent().remove();
            							}
            						}
            						var btnReadmore = $("#btn-readmore");
            						if(btnReadmore.length>0){
            							if(currentUserName){
            								setArticleH(btnReadmore,3);
            							}else{
            								setArticleH(btnReadmore,1.2);
            							}
            						}
            					})()
            				</script>
            				</article>
            
                原文作者:AOP
                原文地址: https://blog.csdn.net/OYziqing/article/details/83411139
                本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
            点赞