Spring AOP两种方式实现实例

AOP简介:

    AOP面向切面编程(AOP是Aspect Oriented Program的首字母缩写)

    我们知道,面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。

    但是人们也发现,在分散代码的同时,也增加了代码的重复性。什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法, 我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。

    也许有人会说,那好办啊,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?这种在运行时,动态地将代码切入到类的指定方法、 指定位置上的编程思想就是面向切面的编程。

    一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。

    这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的。

    AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充

 

第一种:使用xml配置文件实现

1.新建java web project

2.引入jar包

主要是spring包和aspectweaver.jar

3.新建com.aop.Ipeople接口:

package com.aop;

public interface Ipeople {
	public void shangban(); //上班
	public void huijia();   //回家
}

4.新建两个类,Boy和Girl ,继承Ipeople
 

Boy.java:

package com.aop;

public class Boy implements Ipeople{
	   @Override
	    public void shangban() {
	        System.out.println("男人上班");

	    }
	    
	    @Override
	    public void huijia() {
	        System.out.println("男人回家");
	    }

}

*************************************************

Girl.java:

package com.aop;

public class Girl implements Ipeople{

    @Override
    public void shangban() {
        System.out.println("女人上班");

    }

    @Override
    public void huijia() {
        System.out.println("女人回家");
    }
}

5.新建切面类 Qiemian.java:

package com.aop;

public class Qiemian {
	
	  public void shangbanqian(){
	        System.out.println("吃早饭");
	    }
	    public void shangbanhou(){
	        System.out.println("工作");
	    }
	    public void huijiahou(){
	        System.out.println("洗澡睡觉"); 
	    }
}

6.新建配置文件,benas.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"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"
        default-autowire="byName">
        
         <!-- 首相要实例化目标对象类和切面类 -->
        <bean id="boy" class="com.aop.Boy"></bean>
        <bean id="girl" class="com.aop.Girl"></bean>
        <bean id="qiemian" class="com.aop.Qiemian"></bean>
        
        <aop:config>
        <!-- 要切入的对象 -->                 
        <aop:pointcut expression="execution(* com.aop.*.shangban(..))" id="shangban"/>
        <aop:pointcut expression="execution(* com.aop.*.huijia(..))" id="huijia"/>
       
        <!-- 切入点 -->
        <aop:aspect id="ha" ref="qiemian"><!-- 切面类  -->
            <!--  <aop:之前before、之后after... method="切面类中的方法" pointcut-ref="上面的切入的对象"/>  -->
            <aop:before method="shangbanqian()" pointcut-ref="shangban"/><!-- 之前通知 -->
            <aop:after  method="shangbanhou()()" pointcut-ref="shangban"/><!-- 之后通知 -->
            <aop:after method="huijiahou()" pointcut-ref="huijia"/>
        </aop:aspect>
    </aop:config>
</beans>

7.新建测试类Testor.java

package com.aop;


import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Testor {
	
	@Test
	public  void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //要用接口接收
        Ipeople b= (Ipeople)context.getBean("boy");
        b.shangban();
        b.huijia();
        System.out.println("*********************************");
        //要用接口接收
        Ipeople g= (Ipeople) context.getBean("girl");
        g.shangban();
        g.huijia();
    }
}

8.最后测试运行,结果:

 

 

 

 

 

 

第二种,用注解方式实现:

1.新建com.aop.Ipeople接口,和上面的一样

2.新建Boy和Girl,继承Ipeople

Boy.java:
package com.aop;

import org.springframework.stereotype.Component;
@Component
public class Boy implements Ipeople{
	   @Override
	    public void shangban() {
	        System.out.println("男人上班");

	    }
	    @Override
	    public void huijia() {
	        System.out.println("男人回家");
	    }
}

************************************************
Girl.java:
package com.aop;

import org.springframework.stereotype.Component;

@Component
public class Girl implements Ipeople{

    @Override
    public void shangban() {
        System.out.println("女人上班");
    }

    @Override
    public void huijia() {
        System.out.println("女人回家");
    }
}

3.新建切面类 zjQiemian:

package com.aop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect //声明该类是切面类
@Component//配置文件中启动自动扫描功能
public class zjQiemian {
    
    @Before("execution(* com.aop.*.shangban(..))")//在那个方法的之前通知    *代表全部..代表所有形参,不管有多少
    public void shangbanqian(){
        System.out.println("吃早饭");
    }
    @After("execution(* com.aop.*.shangban(..))")//在那个方法之后通知
    public void shangbanhou(){
        System.out.println("工作");
    }
    @Before("execution(* com.aop.*.huijia(..))")
    public void huijiahou(){
        System.out.println("洗澡睡觉");
        
    }

}

 

5.新建配置文件 zjbeans.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"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd" >

        <!-- 自动扫描包下的类,并将其实例化。多个包之间用,隔开 -->
        <context:component-scan base-package="com.aop"></context:component-scan>
        <!-- 配置文件中启动AspectJ的注解功能 ,默认是false,要将其改为true -->
        <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy> 
</beans>

 

新建测试类 zjTestor.java:

package com.aop;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class zjTestor {
    @Test
    public  void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("zjbeans.xml");
        Boy b= context.getBean(Boy.class);
        b.shangban();
        b.huijia();
        System.out.println("*********************************");
        Girl g=  context.getBean(Girl.class);
        g.shangban();
        g.huijia();
    }
}

 

最后测试结果,和上面一样

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值