`
jianchen
  • 浏览: 336204 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring学习之第三篇

阅读更多

AOP技术
使用jdk提供的动态代理技术,可以实现对横向性切点关注.实现对目标对象的方法拦截,做出相应的处理.动态代理请参见前面的博文.使用jdk提供的代理类,要求目标对象要实现相应的接口才行。

但在实际应用中,很多类其实并没有实现接口。那么我们又如何来实现拦截技术呢?
可以使用CGlib包提供的代理来实现。
注:CGLIB可以生成目标类的子类,并重写父类非final修饰符的方法。
示例代码如下:

public class CGLIBProxy implements MethodInterceptor{
        private Object targetObject;//代理的目标对象
        public Object createProxyInstance(Object targetObject){
                this.targetObject = targetObject;
                Enhancer enhancer = new Enhancer();//该类用于生成代理对象
`               enhancer.setSuperclass(this.targetObject.getClass());//设置父类
                enhancer.setCallback(this);//设置回调对象为本身
                return enhancer.create();//返回代理对象
        }

        public Object intercept(Object proxy,Method method,Object[] args,MethodProxy methodProxy)throws Throwable{
                Object result;//环绕通知
                //....preAdvice()--->前置通知
                try{
                        result = methodProxy.invoke(this.targetObject,args);
                        //....afterAdvice()--->后置通知
                }catch(RuntimeException e){
                        //exceptionAdvice()--->异常通知
                }finally{
                        //finallyAdvice()--->最终通知
                }
                return result;
        }
}

 

AOP中的概念:
Aspect(切面):指横切性关注点的抽象即为切面,它与类相识,只是两者的关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象。

Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器。

Pointcut(切入点):所谓切入点是指我们要对那些joinpoint进行拦截的定义。匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。

Advice(通知):所谓通知是指拦截到joinpoint之后所要做的事情就是通知。通知分为前置通知,后置通知,异常通知,最终通知,环绕通知。

Target(目标对象):代理的目标对象

Weave(织入):指将aspects应用到target对象并导致proxy对象创建的过程称为织入。

Introduction(引入):在不修饰类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或field。

使用Spring进行面向切面(AOP)编程
要进行AOP编程,首先我们要在spring的配置文件中引入AOP命名空间:

<?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-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd ">
<aop:aspectj-autoproxy/>
....//当然必须把bean和拦截器bean在配置文件中指定,交由spring容器进行管理
....
</beans>

注:蓝色部分启动对@Aspect注解的支持

spring提供了两种切面使用方式,实际工作中我们可以选用其中一种:
★基于XML配置方式进行AOP开发。
★基于注解方式进行AOP开发。

基于注解的方式声明切面:使用到了AspectJ的支持。
示例:
@Aspect
public class LogPrint{
@Pointcut("execution( * cn.jianchen.service.impl..* .*(..))")    //蓝色的*号表示拦截的业务方法的返回值可以为任意类型,可以指定为具体的类型,如java.lang.String。浅绿色部分表示包名。后面跟了两个点号,表示下面的子包。后面紧跟着的星号表示匹配任意的类,也可以使用具体的类名。在后面的*号表示方法名,可以指定具体的类的方法名,用星号表示拦截任意方法。后面的括号表示方法的参数。其中的两点表示参数可有可无。
        private void anyMethod(){}//声明了一个切入点

@Before("anyMethod() && args(userName)") //定义前置通知。这里还附加上了方法参数的限制,也就是说只会对具有唯一一个字符串类型参数的方法进行执行前置通知的拦截。同时获得传递进来的参数
        public void daAccessCheck(String userName){
        }
@AfterReturning( pointcut="anyMethod()",returning="revalue")//定义后置通知,同时会把业务方法返回结果传到revalue中。业务方法返回参数类型需要和通知方法中的参数类型一致。
        public void doReturnCheck(String revalue){
        }

@AfterThrowing (pointcut="anyMethod()",throwing="ex")//定义异常通知
        public void doExceptionAction(Exception ex){
        }

@After ("anyMethod()")//定义最终通知
public void doReleaseAction(){
        }

@Around ("anyMethod()")//环绕通知
public Object doBasicProfiling(ProceedingJoinPoint pjp){ //环绕通知的固定声明,返回类型和参数类型不可以被修改,其他部分不要求
                return pjp.proceed();//必须调用该方法,会导致先执行后面的切面,切面都执行完毕后,才执行业务bean的方法。
        }
}

注: 实现了环绕通知,完全可以代替使用上面的四种通知。只需要在pjp.proceed()方法前后加上相应的代码,便可以实现前置通知,后置通知,异常通知,最终通知。

基于XML配置方式声明切面
<bean id="personService" class="cn.jianchen.service.PersonServiceBean"/>
<bean id="log" class="cn.jianchen.service.LogPrint"/> //具体的拦截器
<aop:config>
    <aop:aspect id="myAspect" ref="log" > //定义一个切面
         <aop:pointcut id="mycut" expression="execution(* cn.jianchen.service.PersonServiceBean.*(..))"/>
         <aop:before pointcut-ref="mycut" method="doAccessCheck"/>
         <aop:after-returning pointcut-ref="mycut" method="doReturnCheck"/>
         <aop:after-throwing pointcut-ref="mycut" method="doExceptionAction"/>
         <aop:after pointcut-ref="mycut" method="doReleaseAction"/>
         <aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
    </aop:aspect>
</aop:config>

切入点表达式的书写:
expression="execution(* cn.jianchen.service.PersonServiceBean.*(..))"
返回值类型:可以用expression="execution(!void cn.jianchen.service.PersonServiceBean.*(..))"来表示排除返回值类型为void的方法,即不拦截此类方法。
拦截的方法参数expression="execution(* cn.jianchen.service.PersonServiceBean.*(String,.. ))"表示拦截方法的第一个参数类型为String,后面的参数无所谓的方法。
返回值类型:expression="execution(java.lang.String cn.jianchen.service.PersonServiceBean.*(..))"表示只拦截返回为string类型的方法。

spring的AOP机制:
如果满足拦截条件的类实现了接口。则spring使用jdk提供的动态代理创建代理对象实现aop。
如果满足拦截条件的类未实现接口。则spring使用cglib提供的方法实现代理的对象的创建,实现aop。

分享到:
评论

相关推荐

    SpringCloud视频教程全套百度网盘

    第3章 Redis高级缓存讲解及应用 第4章 SpringSecurity安全详细讲解及应用 第5章 RabbitMQ高级消息的讲解及应用 第6章 ElasticSearch详细讲解及应用 第7章 Eureka分布式服务器的搭建 。。。。。。。。。 第15章 ...

    JAVA spring 系列案例50个和学习资料

    Spring系列第3篇:Spring容器基本使用及原理。Spring系列第4篇:xml中bean定义详解(-)Spring系列第5篇:创建bean实例这些方式你们都知道?Spring系列第6篇:玩转bean scope,避免跳坑里!Spring系列第7篇:依赖注入...

    《精通Spring2.X企业应用开发详解》随书源码1-15章

    Spring容器高级主题 第6章 Spring AOP基础 第7章 基于@AspectJ和Schema的 第7章 AOP 第3篇 数据库访问 第8章 Spring对DAO的支持 第9章 Spring的事务管理 第10章 使用Spring JDBC访问数据库 ...

    Spring全家桶课程 基础篇:Spring MVC快速开发 的源码

    内容概要:该资源是Spring全家桶视频课程的第二部分Spring MVC的源码,其对于Spring的最常用的基本功能,如:表单、国际化、过滤器、拦截器、log等都使用案例进行了说明,并且在最后通过一个贯穿前、中、后台的案例...

    Spring 深度学习 看这篇就够了(一)

    Spring 深度学习 看这篇就够了(一)第 1 章 spring概述1.1 spring概述1.1.1 spring 是什么1.1.2 spring 的优势1.1.3 spring 体系结构第 2 章 IOC 的概念和作用2.1 程序的耦合和解耦2.1.1 什么是程序的耦合2.1.2 ...

    Spring MVC+MyBatis开发从入门到项目实战

    第3篇是Spring MVC技术入门,包括Spring MVC的背景介绍、架构整体剖析、环境搭建、处理器与映射器的讲解、前端控制器的源码分析、多种视图解析器的介绍、请求映射与参数绑定的介绍、Validation校验与异常处理和拦截...

    《精通Spring2.X企业应用开发详解》16-19章

    Spring容器高级主题 第6章 Spring AOP基础 第7章 基于@AspectJ和Schema的 第7章 AOP 第3篇 数据库访问 第8章 Spring对DAO的支持 第9章 Spring的事务管理 第10章 使用Spring JDBC访问数据库 ...

    《精通Spring2.X企业应用开发详解》20-23

    Spring容器高级主题 第6章 Spring AOP基础 第7章 基于@AspectJ和Schema的 第7章 AOP 第3篇 数据库访问 第8章 Spring对DAO的支持 第9章 Spring的事务管理 第10章 使用Spring JDBC访问数据库 ...

    Spring全家桶核心篇:SpringBoot快速入门 源码

    内容概要:该资源是Spring全家桶视频课程的第三部分Spring Boot的源码,其对于Spring Boot的最常用的第一个小程序、JavaConfig和常见注解、启动改变、热部署、Springboot整合Thymeleaf/freemarker/JSP、异常处理、...

    Java Web整合开发王者归来(JSP+Servlet+Struts+Hibernate+Spring)

    第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内容,也包括Struts 2.x中的内容;第5篇为Hibernate框架...

    Java Web整合开发完全自学手册:Struts+Hibernate+Spring+Eclipse源码

    《JavaWeb整合开发完全自学...《JavaWeb整合开发完全自学手册》的重点第二篇Struts、第三篇Hibernate、第四篇Spring采用了相似的行文结构,条理清楚,不仅可作为stepbystep的入门书籍,也可作为读者自学的案头参考书。

    Restlet学习的三篇文章

    共三篇文章,第一篇讲述了基于JAX-RS的rest服务开发,第二篇讲基于Restlet的rest服务开发,第三篇讲restlet与spring整合

    Spring Boot实战入门篇视频课程

    通过大量的实战编码进行讲解,课程以...第二章:springboot核心功能第三章:热部署的几种模式第四章:Web开发的各种技术第五章:数据访问层:spring data jpa、jdbctemplate、mybatis、redis第六章:异常相关的处理

    springboot项目整合.zip

    第三篇:SpringBoot日志配置] 第四篇:整合Thymeleaf模板] 第五篇:使用JdbcTemplate访问数据库] 第六篇:整合SpringDataJpa] 第七篇:整合Mybatis] 第八篇:通用Mapper与分页插件的集成] 第九篇:整合...

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集.zip

    第三题 对比HashTable HashMap TreeMap有什么不同.pdf 第二题 Exception Error区别.pdf 第五题 如何保证集合是线程安全的.pdf 第八题 Java并发类库提供的线程池有哪几种 分别有什么特点.pdf 第六题 synchronized和...

    Lhy_Machine_Learning:李宏毅2021Spring机器学习课程课件及作业

    Learning李宏毅2021Spring机器学习课程课件及作业B站视频地址: : 课程主页: : 不定期分享读研干货,点赞关注一起进步: ://space.bilibili.com/46880349人工智能技术探讨群:78174903 第一节简介作业HW1:回归第二...

    JAVA WEB从入门到精通 随书源码 J2EE

    第二篇、第三篇和第四篇分别采用了相似的行文结构,条理清楚地讲解了Struts、Hibernate和Spring三种框架所包含的组件。第五篇则通过Struts+Spring+Hibernate解决方案实现一个完整的应用实例。 全书配合大量的图例及...

    java web技术开发大全(最全最新)

    第3篇 Hibernate篇 第17章 Hibernate的Helloworld程序 第18章 配置Hibernate 第19章 Hibernate的会话与O/R映射 第20章 Hibernate的查询与更新技术 第21章 Hibernate的高级技术 第4篇 Spring篇 第22章 Spring的...

    Java.Web整合开发王者归来.part04.rar

    第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内容,也包括Struts 2.x中的内容;第5篇为Hibernate框架...

    Java.Web整合开发王者归来.part02.rar

    第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内容,也包括Struts 2.x中的内容;第5篇为Hibernate框架...

Global site tag (gtag.js) - Google Analytics