zoukankan      html  css  js  c++  java
  • Java基础-SSM之Spring的POJO(Plain Old Java Object)实现AOP

                Java基础-SSM之Spring的POJO(Plain Old Java Object)实现AOP

                                                作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

      上次我分享过Spring传统的AOP编程(https://www.cnblogs.com/yinzhengjie/p/9288904.html),也知道AOP编程的其实就是动态代理模式。而本篇博客介绍的是另外一种实现AOP编程的方式,即:直接通过XML和POJO的方式实现AOP编程。

    一.xml-pojo实现AOP

    1>.配置Maven依赖

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     5     <modelVersion>4.0.0</modelVersion>
     6 
     7     <groupId>cn.org.yinzhengjie</groupId>
     8     <artifactId>MySpring</artifactId>
     9     <version>1.0-SNAPSHOT</version>
    10 
    11     <dependencies>
    12         <dependency>
    13             <groupId>junit</groupId>
    14             <artifactId>junit</artifactId>
    15             <version>4.11</version>
    16         </dependency>
    17         <dependency>
    18             <groupId>org.springframework</groupId>
    19             <artifactId>spring-context-support</artifactId>
    20             <version>4.3.5.RELEASE</version>
    21         </dependency>
    22         <dependency>
    23             <groupId>aopalliance</groupId>
    24             <artifactId>aopalliance</artifactId>
    25             <version>1.0</version>
    26         </dependency>
    27         <dependency>
    28             <groupId>org.aspectj</groupId>
    29             <artifactId>aspectjrt</artifactId>
    30             <version>1.6.1</version>
    31         </dependency>
    32         <dependency>
    33             <groupId>org.aspectj</groupId>
    34             <artifactId>aspectjweaver</artifactId>
    35             <version>1.8.10</version>
    36         </dependency>
    37     </dependencies>
    38 </project>

    2>.编写Spring的XML配置文件(aop.xml)

     1 <?xml version="1.0"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:aop="http://www.springframework.org/schema/aop"
     5        xmlns:context="http://www.springframework.org/schema/context"
     6        xmlns:tx="http://www.springframework.org/schema/tx"
     7        xsi:schemaLocation="http://www.springframework.org/schema/beans
     8                         http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
     9                         http://www.springframework.org/schema/aop
    10                         http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    11                         http://www.springframework.org/schema/context
    12                         http://www.springframework.org/schema/context/spring-context-4.3.xsd
    13                         http://www.springframework.org/schema/tx
    14                         http://www.springframework.org/schema/tx ">
    15     <!-- 目标对象 -->
    16     <bean id="singer" class="cn.org.yinzhengjie.spring.aop.Singer"/>
    17 
    18     <!-- 观众 -->
    19     <bean id="audience" class="cn.org.yinzhengjie.spring.aop.Audience"/>
    20 
    21     <aop:config>
    22         <aop:aspect id="audienceAspect" ref="audience">
    23             <!--
    24                 pointcut : 表示的是切入点;
    25                 id : 给切入点定义一个标签,这个id的值为audiencePointcut,别人可以通过pointcut-ref属性来引用当前的pointcut切入点;
    26                 expression : 表示定义表达式;
    27                 * : 匹配返回值,表示通配符,即返回值类型不限制
    28                 cn.org.yinzhengjie.spring.aop.Actor.show(..) : 表示执行的方法,需要写完整类名,其中“..”表示参数不限制。
    29              -->
    30             <aop:pointcut id="audiencePointcut" expression="execution(* cn.org.yinzhengjie.spring.aop.Actor.show(..))"/>
    31             <!--
    32              before : 前置通知,表示的是在执行方法之前需要执行的代码。
    33              pointcut-ref : 指定切入点链接;
    34              method : 表示触发切入点的方法,即切入点在哪个方法中触发;
    35              -->
    36             <aop:before pointcut-ref="audiencePointcut" method="sitDown"/>
    37             <aop:before pointcut-ref="audiencePointcut" method="turnOffCellPhone"/>
    38           <!--
    39                 after-returning : 后置通知:主要负责处理调用目标对象之后的执行代码;
    40                 pointcut-ref : 指定切入点链接;
    41                 method : 表示触发切入点的方法,即切入点在哪个方法中触发;
    42           -->
    43             <aop:after-returning pointcut-ref="audiencePointcut" method="clap"/>
    44             <!--
    45                 after-throwing : 异常通知。它执行的优先级暂时没法确定,而且不一定执行,顾名思义,它是在有异常的时候才会触发的代码!因此即
    46            使你写了这样的通知,有可能你看不到它的执行结果,除非你故意写一段可能出现异常的代码;
    47             -->
    48             <aop:after-throwing pointcut-ref="audiencePointcut" method="payOff"/>
    49             <!--
    50             after : 最终通知,相当于java异常处理的fanaly代码块,无论如何都会执行的操作;
    51             -->
    52             <aop:after pointcut-ref="audiencePointcut" method="goHome"/>
    53         </aop:aspect>
    54     </aop:config>
    55 </beans>

    3>.编写测试代码

     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.spring.aop;
     7 
     8 /**
     9  * 演员接口
    10  */
    11 public interface Actor {
    12     public void show();
    13 }
    Actor.java 文件内容
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.spring.aop;
     7 
     8 /**
     9  * 歌手,目标类
    10  */
    11 public class Singer implements Actor {
    12     public void show() {
    13         System.out.println("I'm yinzhengjie!");
    14 //        String ss = null;
    15 //        ss.toLowerCase() ;
    16     }
    17 }
    Singer.java 文件内容
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.spring.aop;
     7 
     8 /**
     9  * 观众类
    10  */
    11 public class Audience {
    12 
    13     public void sitDown(){
    14         System.out.println("sitDown");
    15     }
    16     public void turnOffCellPhone(){
    17         System.out.println("turnOffCellPhone");
    18     }
    19     public void clap(){
    20         System.out.println("clap");
    21     }
    22     public void payOff(){
    23         System.out.println("payOff");
    24     }
    25     public void goHome(){
    26         System.out.println("goHome");
    27     }
    28 }
    Audience.java 文件内容
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.spring.aop;
     7 
     8 import org.springframework.context.ApplicationContext;
     9 import org.springframework.context.support.ClassPathXmlApplicationContext;
    10 
    11 public class App {
    12     public static void main(String[] args) {
    13         //加载类的路径XMl配置文件,实例化容器。得到ApplicationContext的对象ac,我们将文件放在“resource”目录下。否则会抛异常找不到文件哟!
    14         ApplicationContext ac = new ClassPathXmlApplicationContext("aop.xml");
    15         //通过该ac的getBean方法获取到配置文件中的bean标签的指定id为"singer"的对象,由于返回的是Object对象,因此我们需要强转一下。
    16         Actor actor = (Actor) ac.getBean("singer");
    17         //调用actor对象的show方法。
    18         actor.show();
    19     }
    20 }

       以上代码执行结果如下:

    二.xml-pojo实现AOP(环绕通知) 

    1>.配置Maven依赖

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     5     <modelVersion>4.0.0</modelVersion>
     6 
     7     <groupId>cn.org.yinzhengjie</groupId>
     8     <artifactId>MySpring</artifactId>
     9     <version>1.0-SNAPSHOT</version>
    10 
    11     <dependencies>
    12         <dependency>
    13             <groupId>junit</groupId>
    14             <artifactId>junit</artifactId>
    15             <version>4.11</version>
    16         </dependency>
    17         <dependency>
    18             <groupId>org.springframework</groupId>
    19             <artifactId>spring-context-support</artifactId>
    20             <version>4.3.5.RELEASE</version>
    21         </dependency>
    22         <dependency>
    23             <groupId>aopalliance</groupId>
    24             <artifactId>aopalliance</artifactId>
    25             <version>1.0</version>
    26         </dependency>
    27         <dependency>
    28             <groupId>org.aspectj</groupId>
    29             <artifactId>aspectjrt</artifactId>
    30             <version>1.6.1</version>
    31         </dependency>
    32         <dependency>
    33             <groupId>org.aspectj</groupId>
    34             <artifactId>aspectjweaver</artifactId>
    35             <version>1.8.10</version>
    36         </dependency>
    37     </dependencies>
    38 </project>

    2>.编写Spring的XML配置文件(aop2.xml)

     1 <?xml version="1.0"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:aop="http://www.springframework.org/schema/aop"
     5        xmlns:context="http://www.springframework.org/schema/context"
     6        xmlns:tx="http://www.springframework.org/schema/tx"
     7        xsi:schemaLocation="http://www.springframework.org/schema/beans
     8                         http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
     9                         http://www.springframework.org/schema/aop
    10                         http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    11                         http://www.springframework.org/schema/context
    12                         http://www.springframework.org/schema/context/spring-context-4.3.xsd
    13                         http://www.springframework.org/schema/tx
    14                         http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
    15     <!-- 目标对象 -->
    16     <bean id="singer" class="cn.org.yinzhengjie.spring.aop2.Singer" />
    17 
    18     <!-- 观众 -->
    19     <bean id="audience" class="cn.org.yinzhengjie.spring.aop2.Audience" />
    20 
    21     <aop:config>
    22         <aop:aspect id="audienceAspect" ref="audience">
    23             <!--
    24                 *  :统配返回值
    25                 *. :任何包以及子包
    26                  . :包和类的分割
    27                  Actor:类或者接口
    28                  .*  : 类或者接口中的任何方法
    29                  (..) : 参数不限
    30             -->
    31             <aop:around method="watch" pointcut="execution(* *..Actor.*(..))" />
    32         </aop:aspect>
    33     </aop:config>
    34 </beans>

    3>.编写测试代码

     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.spring.aop2;
     7 
     8 /**
     9  * 演员接口
    10  */
    11 public interface Actor {
    12     public void show();
    13 }
    Actor.java 文件内容
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.spring.aop2;
     7 
     8 /**
     9  * 歌手,目标类
    10  */
    11 public class Singer implements Actor {
    12     public void show() {
    13         System.out.println("我有一只小毛驴,从来也不骑.......");
    14         //模拟异常
    15 //        String ss = null;
    16 //        ss.toLowerCase() ;
    17     }
    18 }
    Singer.java 文件内容
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.spring.aop2;
     7 
     8 import org.aspectj.lang.ProceedingJoinPoint;
     9 
    10 /**
    11  * 观众
    12  */
    13 public class Audience {
    14 
    15     /**
    16      * 观看表演
    17      */
    18     public Object watch(ProceedingJoinPoint pjp){
    19         try {
    20             System.out.println("sitDown");
    21             System.out.println("turnOffCellPhone");
    22             Object ret = pjp.proceed();
    23             System.out.println("clap");
    24             return ret ;
    25         } catch (Throwable e) {
    26             System.out.println("payOff");
    27         }
    28         finally {
    29             System.out.println("goHome");
    30         }
    31         return null ;
    32     }
    33 }
    Audience.java 文件内容
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.spring.aop2;
     7 
     8 import org.springframework.context.ApplicationContext;
     9 import org.springframework.context.support.ClassPathXmlApplicationContext;
    10 
    11 public class App {
    12     public static void main(String[] args) {
    13         ApplicationContext ac = new ClassPathXmlApplicationContext("aop2.xml");
    14         Actor actor = (Actor) ac.getBean("singer");
    15         actor.show();
    16     }
    17 }

      以上代码执行结果如下:

    三.注解方式配置spring 

       注解是为了给类或者方法加上标记,注解是是可以通过编程提取的,它和注释可不一样哟!

    1>.导入Maven依赖

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     5     <modelVersion>4.0.0</modelVersion>
     6 
     7     <groupId>cn.org.yinzhengjie</groupId>
     8     <artifactId>MySpring</artifactId>
     9     <version>1.0-SNAPSHOT</version>
    10 
    11     <dependencies>
    12         <dependency>
    13             <groupId>junit</groupId>
    14             <artifactId>junit</artifactId>
    15             <version>4.11</version>
    16         </dependency>
    17         <dependency>
    18             <groupId>org.springframework</groupId>
    19             <artifactId>spring-context-support</artifactId>
    20             <version>4.3.5.RELEASE</version>
    21         </dependency>
    22         <dependency>
    23             <groupId>aopalliance</groupId>
    24             <artifactId>aopalliance</artifactId>
    25             <version>1.0</version>
    26         </dependency>
    27         <dependency>
    28             <groupId>org.aspectj</groupId>
    29             <artifactId>aspectjrt</artifactId>
    30             <version>1.6.1</version>
    31         </dependency>
    32         <dependency>
    33             <groupId>org.aspectj</groupId>
    34             <artifactId>aspectjweaver</artifactId>
    35             <version>1.8.10</version>
    36         </dependency>
    37     </dependencies>
    38 </project>

    2>.编写Spring的XML配置文件(aop.xml)

     1 <?xml version="1.0"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:aop="http://www.springframework.org/schema/aop"
     5        xmlns:context="http://www.springframework.org/schema/context"
     6        xmlns:tx="http://www.springframework.org/schema/tx"
     7        xsi:schemaLocation="http://www.springframework.org/schema/beans
     8                         http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
     9                         http://www.springframework.org/schema/aop
    10                         http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    11                         http://www.springframework.org/schema/context
    12                         http://www.springframework.org/schema/context/spring-context-4.3.xsd
    13                         http://www.springframework.org/schema/tx
    14                         http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
    15     <!-- 配置组件扫描(目的是扫描出加了注解的类或者包) -->
    16     <context:component-scan base-package="cn.org.yinzhengjie.spring.service" />
    17 
    18 </beans>

    3>.编写代码

     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.spring.service;
     7 
     8 public interface ByeService {
     9     public void sayBye() ;
    10 }
    ByeService.java 接口文件内容
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.spring.service;
     7 
     8 public interface WelcomeService {
     9     public void sayHello() ;
    10 }
    WelcomeService.java 接口文件内容
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.spring.service;
     7 
     8 import org.springframework.stereotype.Service;
     9 
    10 @Service
    11 public class ByeServiceImpl implements ByeService{
    12     private String bye ;
    13     
    14     public ByeServiceImpl(){
    15         System.out.println("new ByeServiceImpl()");
    16     }
    17 
    18     public String getBye() {
    19         return bye;
    20     }
    21 
    22     public void setBye(String bye) {
    23         this.bye = bye;
    24     }
    25 
    26     public void sayBye() {
    27         System.out.println(bye);
    28     }
    29 }
    ByeServiceImpl.java 文件内容
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.spring.service;
     7 
     8 import org.springframework.context.annotation.Scope;
     9 import org.springframework.stereotype.Service;
    10 
    11 import javax.annotation.Resource;
    12 
    13 @Service("yinzhengjie")             //注解是可以指定名称的,如果不指定会默认为当前类名并且首字母会小写!
    14 @Scope("prototype")                //指定Spring bean的范围为原型模式("prototype")
    15 public class WelcomeServiceImpl implements WelcomeService{
    16     private String name ;
    17 
    18     private ByeService bs ;
    19     public WelcomeServiceImpl(){
    20         System.out.println("new WelcomeServiceImpl()");
    21     }
    22     public ByeService getBs() {
    23         return bs;
    24     }
    25 
    26     //注入依赖,使用关键字name指定具体注入注解,当然也可以不在方法中注入,我们也可以在字段中注入哟!
    27     @Resource(name="byeServiceImpl")
    28     public void setBs(ByeService bs) {
    29         System.out.println("正在注入 : byeServiceImpl");
    30         this.bs = bs;
    31     }
    32     public String getName() {
    33         return name;
    34     }
    35     public void setName(String name) {
    36         this.name = name;
    37     }
    38     public void sayHello() {
    39         bs.sayBye();
    40         System.out.println("I'm yinzhengjie !!!");
    41     }
    42 }
    WelcomeServiceImpl.java 文件内容
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.spring.service;
     7 
     8 import org.springframework.context.ApplicationContext;
     9 import org.springframework.context.support.ClassPathXmlApplicationContext;
    10 
    11 
    12 public class App {
    13     public static void main(String[] args) {
    14         ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
    15         WelcomeService ws = (WelcomeService) ac.getBean("yinzhengjie");
    16         ws.sayHello();
    17         ByeService bs = (ByeService) ac.getBean("byeServiceImpl");
    18         System.out.println(bs);
    19 
    20     }
    21 }

      以上代码执行结果如下:

                          

  • 相关阅读:
    【python】@property装饰器
    使用pycharm专业版创建虚拟环境
    scrapy爬虫框架入门实战
    LoadRunner10个用户并发测试时分别取不同的参数运行脚本
    selenium grid原理
    使用 PHP 过滤器(Filter)进行严格表单验证
    ios之gcd
    ios之runloop笔记
    ios之block笔记
    iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/9290448.html
Copyright © 2011-2022 走看看