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 ...
随机推荐
- P3302 [SDOI2013]森林
树上第k小是裸题,然后连边操作显然只能用启发式合并 连边之后重构小的部分,重构一遍主席树和倍增数组,水的一批(逃 #include<bits/stdc++.h> #define il in ...
- 蓝牙inquiry流程之HCI_Inquiry_Result_With_RSSI和HCI Extended Inquiry Result处理
首先介绍一下和inquiry的相关的流程. inquiry是从协议栈下发的一个HCI命令.其格式如下: 这里简单介绍下第二个参数,是inquiry的持续时间, 从上图看出 inquiry持续的时间是 ...
- SpringBoot整合Mybatis之进门篇
已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...
- WebService技术,服务端发布到Tomcat(使用Servlet发布),客户端使用axis2实现(二)
还是在WebService技术,服务端and客户端JDK-wsimport工具(一)的基础上实现.新建一个包:com.aixs2client.目录结构如下: 一.服务端: 1.还是使用com.webs ...
- numpy 初识(一)
基本操作: 读取文件(与pandas读取csv相似): import numpy numpy.genfromtxt("word.txt", delimiter=',', dtype ...
- A1046. Shortest Distance(20)
17/20,部分超时. #include<bits/stdc++.h> using namespace std; int N,x,pairs; int a,b; vector<int ...
- ini_set的用法介绍
https://www.cnblogs.com/xieqian111/p/5367732.html
- Linux内核分析——第三周学习笔记20135308
第三周 构造一个简单的Linux系统MenuOS 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程上下文的切换 ...
- 《Linux内核设计与实现》第五章读书笔记
第五章 系统调用 5.1与内核通信 1. 系统调用 让应用程序受限的访问硬件设备 提供创建新进程并与已有进程通信的机制 提供申请操作系统其他资源能力是用户空间进程和硬件设备之间的中间层 2. 系统调 ...
- 每日scrum(7)
今天是小组用来写文稿的日子,包括软件需求分析报告,概要设计报告,详细设计报告,数据库设计报告,软件测试报告,各组员领取自己的任务然后完成~ 任务看板: 燃尽图: