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依赖
<?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的更多相关文章
- Java基础-SSM之Spring和Mybatis以及Spring MVC整合案例
Java基础-SSM之Spring和Mybatis以及Spring MVC整合案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 能看到这篇文章的小伙伴,详细你已经有一定的Java ...
- Java基础-SSM之Spring MVC入门篇
Java基础-SSM之Spring MVC入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spring MVC简介 1>.什么是Spring MVC 答:Sprin ...
- Java基础-SSM之Spring和Mybatis整合案例
Java基础-SSM之Spring和Mybatis整合案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在之前我分享过mybatis和Spring的配置案例,想必大家对它们的 ...
- Java基础-SSM之Spring的AOP编程
Java基础-SSM之Spring的AOP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Spring的本质说白了就是动态代理,接下来我们会体验AOP的用法.它是对OOP的 ...
- Java基础-SSM之Spring快速入门篇
Java基础-SSM之Spring快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java ...
- Java基础-SSM之mybatis快速入门篇
Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...
- Java基础-SSM之mybatis的统计函数和分页查询
Java基础-SSM之mybatis的统计函数和分页查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Java基础-SSM之mybatis一对一关联
Java基础-SSM之mybatis一对一关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建husbands和wifes表并建 ...
- Java基础-SSM之mybatis多对多关联
Java基础-SSM之mybatis多对多关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建teas,stus,links表 u ...
随机推荐
- 校内模拟赛 coin
题意: n*m的棋盘,每个格子可能是反着的硬币,正着的硬币,没有硬币,每次可以选未选择的一行或者未选择的一列,将这一行/列的硬币取反.如果没有可选的或者硬币已经全部正面,那么游戏结束. 最后一次操作的 ...
- SSRS配置2:加密管理
在初始化Reporting Service时,SSRS会自动创建数据库[ReportServer],用于存储报表元数据,报表订阅,以及凭证(Credential)和连接信息等身份验证信息,身份验证数据 ...
- EVA索赔系统JAVA拦截例外站点
控制面板->JAVA->JAVA控制面板->安全->添加以下例外站点: https://aftersales.i.daimler.com https://swdist.afte ...
- Runtime.getRuntime().addShutdownHook(Thread thread) 程序关闭时钩子,优雅退出程序
根据 Java API, 所谓 shutdown hook 就是已经初始化但尚未开始执行的线程对象.在Runtime 注册后,如果JVM要停止前,这些 shutdown hook 便开始执行.也就是在 ...
- 通过Heketi管理GlusterFS为K8S集群提供持久化存储
参考文档: Github project:https://github.com/heketi/heketi MANAGING VOLUMES USING HEKETI:https://access.r ...
- B1030 完美数列 (25 分)
这是一道二分法的题目,许久不使用二分法,感觉有点生疏. #include<bits/stdc++.h> using namespace std; const int MAXN=100000 ...
- 3. Python3 基本数据类型
Python3 基本数据类型 Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型& ...
- python3【基础】-赋值与深浅拷贝
一.Python的变量及其存储 在高级语言中,变量是对内存及其地址的抽象.对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址, ...
- 一份超全超详细的 ADB 用法大全
http://blog.csdn.net/u010375364/article/details/52344120
- LeetCode 628. Maximum Product of Three Numbers三个数的最大乘积 (C++)
题目: Given an integer array, find three numbers whose product is maximum and output the maximum produ ...