这里有新鲜出炉的精品教程, 程序狗速度看过来!
Spring Framework 开源 j2ee 框架
Spring 是什么呢? 首先它是一个开源的项目, 而且目前非常活跃; 它是一个基于 IOC 和 AOP 的构架多层 j2ee 系统的框架, 但它不强迫你必须在每一层 中必须使用 Spring, 因为它模块化的很好, 允许你根据自己的需要选择使用它的某一个模块; 它实现了很优雅的 MVC, 对不同的数据访问技术提供了统一的接口, 采用 IOC 使得可以很容易的实现 bean 的装配, 提供了简洁的 AOP 并据此实现 Transcation Managment, 等等
下面小编就为大家带来一篇基于 spring 中的 aop 简单实例讲解小编觉得挺不错的, 现在就分享给大家, 也给大家做个参考一起跟随小编过来看看吧
aop, 即面向切面编程, 面向切面编程的目标就是分离关注点, 比如: 一个骑士只需要关注守护安全, 或者远征, 而骑士辉煌一生的事迹由谁来记录和歌颂呢, 当然不会是自己了, 这个完全可以由诗人去歌颂, 比如当骑士出征的时候诗人可以去欢送, 当骑士英勇牺牲的时候, 诗人可以写诗歌颂骑士的一生那么骑士只需要关注怎么打仗就好了而诗人也只需要关注写诗歌颂和欢送就好了, 那么这样就把功能分离了所以可以把诗人当成一个切面, 当骑士出征的前后诗人分别负责欢送和写诗歌颂 (记录) 而且, 这个切面可以对多个骑士或者明人使用, 并不只局限于一个骑士这样, 既分离了关注点, 也减低了代码的复杂程度
代码示例如下:
骑士类:
- package com.cjh.aop2;
- /**
- * @author Caijh
- *
- * 2017 年 7 月 11 日 下午 3:53:19
- */
- public class BraveKnight {
- public void saying(){
- System.out.println("我是骑士");
- }
- }
诗人类:
- package com.cjh.aop2;
- /**
- * @author Caijh
- *
- * 2017 年 7 月 11 日 下午 3:47:04
- */
- public class Minstrel {
- public void beforSay(){
- System.out.println("前置通知");
- }
- public void afterSay(){
- System.out.println("后置通知");
- }
- }
spring 配置文件:
- <?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"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
- <!-- 目标对象 -->
- <bean id="knight" class="com.cjh.aop2.BraveKnight"/>
- <!-- 切面 bean -->
- <bean id="mistrel" class="com.cjh.aop2.Minstrel"/>
- <!-- 面向切面编程 -->
- <aop:config>
- <aop:aspect ref="mistrel">
- <!-- 定义切点 -->
- <aop:pointcut expression="execution(* *.saying(..))" id="embark"/>
- <!-- 声明前置通知 (在切点方法被执行前调用)-->
- <aop:before method="beforSay" pointcut-ref="embark"/>
- <!-- 声明后置通知 (在切点方法被执行后调用)-->
- <aop:after method="afterSay" pointcut-ref="embark"/>
- </aop:aspect>
- </aop:config>
- </beans>
测试代码:
- package com.cjh.aop2;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- /**
- * @author Caijh
- *
- * 2017 年 7 月 11 日 下午 4:02:04
- */
- public class Test {
- public static void main(String[] args) {
- ApplicationContext ac = new ClassPathXmlApplicationContext("com/cjh/aop2/beans.xml");
- BraveKnight br = (BraveKnight) ac.getBean("knight");
- br.saying();
- }
- }
执行结果如下:
前置通知
我是骑士
后置通知
=====================================================
aop(面向切面编程)的好处就是, 当执行了我们主要关注的行为 (骑士类对象), 也就是切点, 那么切面(诗人对象) 就会自动为我们进行服务, 无需过多关注如上测试代码, 我们只调用了 BraveKnight 类的 saying()方法, 它就自己在 saying 方法前执行了前置通知方法, 在执行完 saying 之后就自动执行后置通知通过这样我们可以做权限设置和日志处理
补充: pointcut 执行方法书写格式如下
工程目录结构:
如果运行过程中出现 nofoundclass 的错误, 一般是少了: aspectjweaver.jar 这个包, 需要下载
来源: http://www.phperz.com/article/18/0323/356512.html