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依赖

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>cn.org.yinzhengjie</groupId>
<artifactId>MySpring</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
</dependencies>
</project>

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

 <?xml version="1.0"?>
<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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx ">
<!-- 目标对象 -->
<bean id="singer" class="cn.org.yinzhengjie.spring.aop.Singer"/> <!-- 观众 -->
<bean id="audience" class="cn.org.yinzhengjie.spring.aop.Audience"/> <aop:config>
<aop:aspect id="audienceAspect" ref="audience">
<!--
pointcut : 表示的是切入点;
id : 给切入点定义一个标签,这个id的值为audiencePointcut,别人可以通过pointcut-ref属性来引用当前的pointcut切入点;
expression : 表示定义表达式;
* : 匹配返回值,表示通配符,即返回值类型不限制
cn.org.yinzhengjie.spring.aop.Actor.show(..) : 表示执行的方法,需要写完整类名,其中“..”表示参数不限制。
-->
<aop:pointcut id="audiencePointcut" expression="execution(* cn.org.yinzhengjie.spring.aop.Actor.show(..))"/>
<!--
before : 前置通知,表示的是在执行方法之前需要执行的代码。
pointcut-ref : 指定切入点链接;
method : 表示触发切入点的方法,即切入点在哪个方法中触发;
-->
<aop:before pointcut-ref="audiencePointcut" method="sitDown"/>
<aop:before pointcut-ref="audiencePointcut" method="turnOffCellPhone"/>
<!--
after-returning : 后置通知:主要负责处理调用目标对象之后的执行代码;
pointcut-ref : 指定切入点链接;
method : 表示触发切入点的方法,即切入点在哪个方法中触发;
-->
<aop:after-returning pointcut-ref="audiencePointcut" method="clap"/>
<!--
after-throwing : 异常通知。它执行的优先级暂时没法确定,而且不一定执行,顾名思义,它是在有异常的时候才会触发的代码!因此即
使你写了这样的通知,有可能你看不到它的执行结果,除非你故意写一段可能出现异常的代码;
-->
<aop:after-throwing pointcut-ref="audiencePointcut" method="payOff"/>
<!--
after : 最终通知,相当于java异常处理的fanaly代码块,无论如何都会执行的操作;
-->
<aop:after pointcut-ref="audiencePointcut" method="goHome"/>
</aop:aspect>
</aop:config>
</beans>

3>.编写测试代码

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.spring.aop; /**
* 演员接口
*/
public interface Actor {
public void show();
}

Actor.java 文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.spring.aop; /**
* 歌手,目标类
*/
public class Singer implements Actor {
public void show() {
System.out.println("I'm yinzhengjie!");
// String ss = null;
// ss.toLowerCase() ;
}
}

Singer.java 文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.spring.aop; /**
* 观众类
*/
public class Audience { public void sitDown(){
System.out.println("sitDown");
}
public void turnOffCellPhone(){
System.out.println("turnOffCellPhone");
}
public void clap(){
System.out.println("clap");
}
public void payOff(){
System.out.println("payOff");
}
public void goHome(){
System.out.println("goHome");
}
}

Audience.java 文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.spring.aop; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class App {
public static void main(String[] args) {
//加载类的路径XMl配置文件,实例化容器。得到ApplicationContext的对象ac,我们将文件放在“resource”目录下。否则会抛异常找不到文件哟!
ApplicationContext ac = new ClassPathXmlApplicationContext("aop.xml");
//通过该ac的getBean方法获取到配置文件中的bean标签的指定id为"singer"的对象,由于返回的是Object对象,因此我们需要强转一下。
Actor actor = (Actor) ac.getBean("singer");
//调用actor对象的show方法。
actor.show();
}
}

   以上代码执行结果如下:

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

1>.配置Maven依赖

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>cn.org.yinzhengjie</groupId>
<artifactId>MySpring</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
</dependencies>
</project>

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

 <?xml version="1.0"?>
<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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 目标对象 -->
<bean id="singer" class="cn.org.yinzhengjie.spring.aop2.Singer" /> <!-- 观众 -->
<bean id="audience" class="cn.org.yinzhengjie.spring.aop2.Audience" /> <aop:config>
<aop:aspect id="audienceAspect" ref="audience">
<!--
* :统配返回值
*. :任何包以及子包
. :包和类的分割
Actor:类或者接口
.* : 类或者接口中的任何方法
(..) : 参数不限
-->
<aop:around method="watch" pointcut="execution(* *..Actor.*(..))" />
</aop:aspect>
</aop:config>
</beans>

3>.编写测试代码

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.spring.aop2; /**
* 演员接口
*/
public interface Actor {
public void show();
}

Actor.java 文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.spring.aop2; /**
* 歌手,目标类
*/
public class Singer implements Actor {
public void show() {
System.out.println("我有一只小毛驴,从来也不骑.......");
//模拟异常
// String ss = null;
// ss.toLowerCase() ;
}
}

Singer.java 文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.spring.aop2; import org.aspectj.lang.ProceedingJoinPoint; /**
* 观众
*/
public class Audience { /**
* 观看表演
*/
public Object watch(ProceedingJoinPoint pjp){
try {
System.out.println("sitDown");
System.out.println("turnOffCellPhone");
Object ret = pjp.proceed();
System.out.println("clap");
return ret ;
} catch (Throwable e) {
System.out.println("payOff");
}
finally {
System.out.println("goHome");
}
return null ;
}
}

Audience.java 文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.spring.aop2; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class App {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("aop2.xml");
Actor actor = (Actor) ac.getBean("singer");
actor.show();
}
}

  以上代码执行结果如下:

三.注解方式配置spring 

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

1>.导入Maven依赖

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>cn.org.yinzhengjie</groupId>
<artifactId>MySpring</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
</dependencies>
</project>

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

 <?xml version="1.0"?>
<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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 配置组件扫描(目的是扫描出加了注解的类或者包) -->
<context:component-scan base-package="cn.org.yinzhengjie.spring.service" /> </beans>

3>.编写代码

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.spring.service; public interface ByeService {
public void sayBye() ;
}

ByeService.java 接口文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.spring.service; public interface WelcomeService {
public void sayHello() ;
}

WelcomeService.java 接口文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.spring.service; import org.springframework.stereotype.Service; @Service
public class ByeServiceImpl implements ByeService{
private String bye ; public ByeServiceImpl(){
System.out.println("new ByeServiceImpl()");
} public String getBye() {
return bye;
} public void setBye(String bye) {
this.bye = bye;
} public void sayBye() {
System.out.println(bye);
}
}

ByeServiceImpl.java 文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.spring.service; import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service("yinzhengjie") //注解是可以指定名称的,如果不指定会默认为当前类名并且首字母会小写!
@Scope("prototype") //指定Spring bean的范围为原型模式("prototype")
public class WelcomeServiceImpl implements WelcomeService{
private String name ; private ByeService bs ;
public WelcomeServiceImpl(){
System.out.println("new WelcomeServiceImpl()");
}
public ByeService getBs() {
return bs;
} //注入依赖,使用关键字name指定具体注入注解,当然也可以不在方法中注入,我们也可以在字段中注入哟!
@Resource(name="byeServiceImpl")
public void setBs(ByeService bs) {
System.out.println("正在注入 : byeServiceImpl");
this.bs = bs;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void sayHello() {
bs.sayBye();
System.out.println("I'm yinzhengjie !!!");
}
}

WelcomeServiceImpl.java 文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.spring.service; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class App {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
WelcomeService ws = (WelcomeService) ac.getBean("yinzhengjie");
ws.sayHello();
ByeService bs = (ByeService) ac.getBean("byeServiceImpl");
System.out.println(bs); }
}

  以上代码执行结果如下:

                      

Java基础-SSM之Spring的POJO(Plain Old Java Object)实现AOP的更多相关文章

  1. Java基础-SSM之Spring和Mybatis以及Spring MVC整合案例

    Java基础-SSM之Spring和Mybatis以及Spring MVC整合案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 能看到这篇文章的小伙伴,详细你已经有一定的Java ...

  2. Java基础-SSM之Spring MVC入门篇

    Java基础-SSM之Spring MVC入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spring MVC简介 1>.什么是Spring MVC 答:Sprin ...

  3. Java基础-SSM之Spring和Mybatis整合案例

    Java基础-SSM之Spring和Mybatis整合案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   在之前我分享过mybatis和Spring的配置案例,想必大家对它们的 ...

  4. Java基础-SSM之Spring的AOP编程

    Java基础-SSM之Spring的AOP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   Spring的本质说白了就是动态代理,接下来我们会体验AOP的用法.它是对OOP的 ...

  5. Java基础-SSM之Spring快速入门篇

    Java基础-SSM之Spring快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java ...

  6. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

  7. Java基础-SSM之mybatis的统计函数和分页查询

    Java基础-SSM之mybatis的统计函数和分页查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  8. Java基础-SSM之mybatis一对一关联

    Java基础-SSM之mybatis一对一关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表)  1>.创建husbands和wifes表并建 ...

  9. Java基础-SSM之mybatis多对多关联

    Java基础-SSM之mybatis多对多关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建teas,stus,links表 u ...

随机推荐

  1. Python中类和对象在内存中是如何保存?

    类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图: 如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值 ...

  2. [hdu5503]EarthCup[霍尔定理]

    题意 一共 \(n\) 只球队,两两之间会进行一场比赛,赢得一分输不得分,给出每只球队最后的得分,问能否构造每场比赛的输赢情况使得得分成立.多组数据 \(T\le 10,n\le 5\times 10 ...

  3. python面试题(四)

    一.数据类型 1.字典 1.1 现有字典 dict={‘a’:24,‘g’:52,‘i’:12,‘k’:33}请按字典中的 value 值进行排序? sorted(dict.items(),key=l ...

  4. 设计模式 笔记 桥接模式 Bridge

    //---------------------------15/04/15---------------------------- //Bridge 桥接模式----对象结构型模式 /* 1:意图:将 ...

  5. tornado学习笔记

    一.UIMOTHODS: 1.在项目目录创建uimothods.py文件(名称可以任意)内容: def test2(self): return ('hello uimothods') 2.tornad ...

  6. 使用unity3d和tensorflow实现基于姿态估计的体感游戏

    使用unity3d和tensorflow实现基于姿态估计的体感游戏 前言 之前做姿态识别,梦想着以后可以自己做出一款体感游戏,然而后来才发现too young.但是梦想还是要有的,万一实现了呢.趁着p ...

  7. unity中camera摄像头控制详解

    目录 1. 缘起 2. 开发 2.1. 建立项目 2.2. 旋转 2.2.1. 四元数 2.3. 移动 2.3.1. 向量操作 2.4. 镜头拉伸 2.5. 复位 2.6. 优化 1 缘起 我们的产品 ...

  8. PAT甲级题解-1047. Student List for Course (25)-排序

    一开始是建立了course[2501][40001]数组,存储每节课的学生编号然后for循环两层输出,但这样复杂度为O(2500*40000),也很明显导致最后时间超时后来发现最多40000学生,每个 ...

  9. 1090. Highest Price in Supply Chain (25)-dfs求层数

    给出一棵树,在树根出货物的价格为p,然后每往下一层,价格增加r%,求所有叶子节点中的最高价格,以及该层叶子结点个数. #include <iostream> #include <cs ...

  10. 【SE】Week1 : 四则运算题目生成器批改器程序总结

    用户需求详见:http://www.cnblogs.com/jiel/p/4810756.html 1)PSP表格分析(预计耗时): PSP2.1 Personal Software Process ...