文档章节

SSH入门系列14:AOP

O
 ORZ你好
发布于 2017/08/28 13:34
字数 968
阅读 6
收藏 0
点赞 0
评论 0

如何理解AOP编程?

一般程序有如下2个部分组成:

1)实现业务功能的业务逻辑代码

2)实现通用功能的通用服务代码

而在AOP则选择将这两种业务进行分离,以达到方便编写和维护效果。

实现案例:

通过模拟一个婚介平台给所有的相亲者介绍对象的流程。

实现步骤:

1:首先开发业务逻辑接口(动态代理只能通过接口所实现)

public interface IXiangQinInterface {
     public void meet();
}

2:开发实现业务逻辑接口的类

public class BoyXiangQin implements IXiangQinInterface {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void meet() {
        // TODO Auto-generated method stub
  System.out.println("姓名是:"+this.name+"正在相亲");
    }

}


3编写切面类(通用服务类):几种增强

//提供通用服务(切面类)
public class HunjieAspect {
    /*在业务逻辑使用之前使用的方法
     * 一般用在权限检查  
     */
    public void before(){
    System.out.println("婚介所开始相亲会员的审查");    
    }
    
    /* 在业务逻辑使用之后在调用的方法
     * 一般用于资源的释放,如数据库连接对象关闭
     */
    public void after(){
        System.out.println("这次相亲结束");
    }
    //异常处理,一旦业务逻辑出现异常,那么就调用该方法
    //一般主要用于日志记录异常
    public void afterException(Throwable th){
      System.out.println("相亲出现了意外");
  }
    //返回值的增强,一般当执行一个业务逻辑方法的时候,如果有返回值,那么就会植入该方法
    //一般用于日志记录
    public  void  afterReturn(Object result){
        if (result == null) {
            System.out.println("相亲失败");
        }else{
            System.out.println("相亲成功");
        }
    }
    //环绕增强,就是在业务逻辑方法执行期间所植入的方法,一般用于事务处理
     public Object around(ProceedingJoinPoint joinpoint ) throws Throwable{
        System.out.println("开始约会了!");
        Object result = joinpoint.proceed();
         return result;
        
    }
    
}

这里需要导入aop的相关包,否则ProceedingJoinPoint这个找不到

4在spring的配置文件里,编写切面类和业务逻辑类的bean


<!-- 配置切片类的bean -->
<bean id="myPointCut" class="com.spring.bean.HunjieAspect"></bean>
<!-- 配置业务逻辑层的对象 -->
<bean id="boyXiangQin" p:name="张三"  class="com.spring.service.imp.BoyXiangQin"></bean>

5修改配置文件的xml验证,实际就是加入aop的命名空间:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
    " >

6配置切面以及切入点和增强

<aop:config>
       <!-- 配置切面 -->
   <aop:aspect  id="myaspect"  ref="myPointCut">
        <!-- 配置增强和表达式 -->
        <!--  配置切面表达式:表达式表示的是哪些类或者哪些方法要被执行增强-->
        <!-- 表示这个包下面的所有类和方法都进行增强中 -->
        <aop:pointcut  expression="execution(* com.spring.service.imp.*.*(..))"  id="mypointexpress"></aop:pointcut>
        <aop:before method="before"  pointcut-ref="mypointexpress"></aop:before>
        <aop:after method="after"  pointcut-ref="mypointexpress"></aop:after>
        <aop:around method="around"  pointcut-ref="mypointexpress"></aop:around>
       <aop:after-returning  method="afterReturn"   returning="result" pointcut-ref="mypointexpress"></aop:after-returning>
       <aop:after-throwing method="afterException"  throwing="th"  pointcut-ref="mypointexpress"></aop:after-throwing>
   </aop:aspect>
 
       
</aop:config>

7编写实现:注意动态代理只针对接口的实现,所以获取的业务只针对接口

           //动态代理只能用接口实现
              IXiangQinInterface  boyxiang = (IXiangQinInterface)ac.getBean("boyXiangQin");
             boyxiang.meet();

 

关于java中的动态代理模式:

1spring aop中默认采用的是jdk的动态代理。

特点:只能针对接口的实现,也就是在获取这个动态代理对象之后,那么只能通过接口的方式去调用实现。默认值为false

配置:

<aop:config proxy-target-ckass="false"></aop:config>

调用方式:

  ApplicationContext  ac  = new  ClassPathXmlApplicationContext("applicationContext.xml");

IXiangQinInterface  boyxiang = (IXiangQinInterface)ac.getBean("boyXiangQin");
 boyxiang.meet();

2另一种采用的是cglib的动态代理,这种动态代理就可以直接针对普通的类来实现代理,改变aopconfig配置

<aop:config proxy-target-ckass="true"></aop:config>

调用方式:

  ApplicationContext  ac  = new  ClassPathXmlApplicationContext("applicationContext.xml");

BoyXiangQin boyxiang = (BoyXiangQin)ac.getBean("boyXiangQin");
 boyxiang.meet();


                       

© 著作权归作者所有

共有 人打赏支持
O
粉丝 0
博文 12
码字总数 8932
作品 0
南京
Jenkins入门系列

enkins 是一个可扩展的持续集成引擎。 主要用于: l 持续、自动地构建/测试软件项目。 l 监控一些定时执行的任务。 Jenkins拥有的特性包括: l 易于安装-只要把jenkins.war部署到servlet容器...

harries
2016/04/21
218
0
Jenkins入门系列

Jenkins 是一个可扩展的持续集成引擎。 主要用于: l 持续、自动地构建/测试软件项目。 l 监控一些定时执行的任务。 Jenkins拥有的特性包括: l 易于安装-只要把jenkins.war部署到servlet容器...

外星人et59
2016/04/21
0
0
CYQ.Data 数据框架系列索引

索引基础导航: 1:下载地址:http://www.cyqdata.com/download/article-detail-426 2:入门教程:http://www.cyqdata.com/cyqdata/article-cate-33 3:购买授权:http://www.cyqdata.com/cy......

晨曦之光
2012/03/09
0
0
《鸡啄米C++编程入门系列》系列技术文章整理收藏

《鸡啄米C++编程入门系列》系列技术文章整理收藏 收藏整理鸡啄米C++编程入门系列文章,供个人和网友学习C++时参考 1鸡啄米:C++编程入门系列之前言 2鸡啄米:C++编程入门系列之一(进制数) ...

开元中国2015
2015/05/26
132
0
开源中国的 Docker 优秀文章汇总

Docker 是一个开源的 Linux 应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互...

oschina
2014/08/25
5.8K
11
Java Web学习计划

--- 本月为入门阶段,从零开始,一步一步的做出一个实用的网站。 深入学习Java语言,初步掌握前端技术,使用JSP和MySQL完成一个简单的网站 第1周 Java高级编程学习目标:
1.深入了解JDK环境...

SVD
2016/12/01
55
0
《鸡啄米C++编程入门系列》系列技术文章整理收藏

《鸡啄米C++编程入门系列》系列技术文章整理收藏 1鸡啄米:C++编程入门系列之前言 http://www.lai18.com/content/410454.html 2鸡啄米:C++编程入门系列之一(进制数) http://www.lai18.com...

开元中国2015
2015/06/27
0
0
Spring经典视频教程大集合

Spring经典视频教程大集合 Spring是一个开源框架,它由RodJohnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Sprin...

IT小白白
2012/10/08
0
0
Java深入-框架技巧

Java 程序媛手把手教你设计模式中的撩妹神技 -- 上篇 遇一人白首,择一城终老,是多么美好的人生境界,她和他历经风雨慢慢变老,回首走过的点点滴滴,依然清楚的记得当初爱情萌芽的模样…… ...

掘金官方
01/05
0
0
spring 入门及IOC容器

Spring 一.Spring,原意“春天”,是一种轻量级容器框架,所谓轻量级就是依赖比较少,侵入性较低,其核心就是1. IOC(Inversion of Control)/DI(Dependency Injection)IoC的核心思想是通过消...

天国使者125
2013/06/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

分布式之抉择分布式锁

前言: 目前网上大部分的基于zookpeer,和redis的分布式锁的文章都不够全面。要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫。坦白说,这种老题材,很难写出新创意,博...

Java大蜗牛
2分钟前
0
0
rm: cannot remove `xxx’: Operation not permitted

rm: cannot remove `xxx': Operation not permitted可以先用lsattr xxx查看文件的隐藏属性。如果看到-----a-------的情况,可以用chattr -a xxx去除a属性,然后再进行删除就可以了....

殘留回憶
3分钟前
0
0
oracle 如何查看当前用户的表空间名称

如何查询当前用户的表空间名称?因为oracle建立索引,需要知道当前用户的表空间,查找了一下资料 --查询语法-- select default_tablespace from dba_users where username='登录用户' 如,...

youfen
6分钟前
0
0
MicroPython-TPYBoard开发板DIY小型家庭气象站

对于喜欢登山的人来说,都会非常关心自己所处的高度跟温度,海拔高度的测量方法,海拔测量一般常用的有两种方式,一是通过GPS全球定位系统,二是通过测出大气压,根据气压值算出海拔高度。 ...

bodasisiter
6分钟前
0
0
抓取沪A股票资金流向数据

library(rvest)mydata<-list()day1<-Sys.Date()day2<-Sys.Date()-7stock<-c("600695","600734","603693","601990","603650","603045","603895","600735","601999","603970","600619"......

cuyi
7分钟前
0
0
Java中mqtt消息队列发送和订阅消息

1.首先本地建立mqtt协议的服务器 2.直接上代码 package io.powerx.test;import java.util.Date;import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;import org.eclipse.p......

江湖鱼大虾
8分钟前
0
0
数据结构-树的学习

1. 相关连接 维基-二叉搜索树 维基-红黑树 思否-红黑树

liuyan_lc
10分钟前
0
0
Nginx upstream 负载均衡

Nginx upstream 负载均衡 了了情空 关注 2016.05.31 16:16* 字数 612 阅读 537评论 1喜欢 0 上周五同事跟我提一个需求,大概描述是酱紫:“我们现在终端都在访问同一台服务器,如果流量过大造...

linjin200
12分钟前
0
0
Dubbo 源码解读——自定义 Classloader 之 ExtensionLoader

众所周知,Dubbo 是阿里巴巴公司自主研发开源的一个高性能的服务框架(现已捐献给 Apache 基金会组织),应用之间可以通过 RPC 的方式来互相调用并返回结果。主要基于 Java 语言开发,它提供...

Ryan-瑞恩
20分钟前
0
0
Sonar Maven/IDEA集成(未完待续)

前言:在上一篇(SonarQube安装步骤)的基础上,我们来集成maven/IDEA 1.首先是集成maven(maven的安装配置就不多说了) 找到maven安装目录下-conf文件夹-setting.xml文件 然后添加以下配置信...

张艺兴女朋友
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部