Sping之AOP思想

AOP是指面向切面编程,横向重复,纵向提取。在最早接触AOP思想是从servlet开始的,代码如下,设置字符集,通过filter统一设置。

1 @Override
2     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
3             throws IOException, ServletException {
4         request.setCharacterEncoding("UTF-8");
5         chain.doFilter(request, response);
6         response.setCharacterEncoding("UTF-8");
7     }

再有就是再学习Struts2框架时接触到的拦截器栈。有国际化,参数封装,模型驱动,异常等等拦截器。

接着就是Spring的AOP思想,先说结论,Spring的AOP思想是通过动态代理和cglib代理实现,前者优先。

动态代理解释:被代理的对象必须要实现接口,动态代理对象相当于这个接口的实现类,是对被代理对象的扩展。可以看出动态代理是由局限性的,要求被代理对象要实现某个接口。

cglib代理解释:是一个第三方代理,是对被代理对象的继承代理,从而进行扩展。

代码演示

定义接口

1 public interface UserService {
2     void save();
3     void delete();
4     void update();
5     void select();
6 }

实现接口

 1 public class  UserServiceImpl implements UserService{
 2     @Override
 3     public void save() {
 4         System.out.println("调用dao的保存方法");
 5     }
 6
 7     @Override
 8     public void delete() {
 9         System.out.println("调用dao的删除方法");
10     }
11
12     @Override
13     public void update() {
14
15         System.out.println("调用dao的更新方法");
16     }
17
18     @Override
19     public void select() {
20
21         System.out.println("调用dao的查询方法");
22     }
23 }

动态代理演示

 1 /**
 2  * 动态代理
 3  * @author 67471
 4  *
 5  */
 6 public class ProxyUservice implements InvocationHandler{
 7     private UserService userService;
 8
 9     public ProxyUservice(UserService userService) {
10         super();
11         this.userService = userService;
12     }
13
14     public  UserService getUserviceProxy(){
15         //获得代理对象
16         UserService userServiceProxy =  (UserService) Proxy.newProxyInstance(ProxyUservice.class.getClassLoader(),
17                                                                 UserServiceImpl.class.getInterfaces(),
18                                                                 this);
19         return userServiceProxy;
20     }
21
22     //要增强的内容
23     @Override
24     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
25         System.out.println("开启事务");
26         Object invoke = method.invoke(userService, args);
27         System.out.println("提交事务");
28         return invoke;
29     }
30 }

测试代码

 1 public class ProxyTest {
 2     public static void main(String[] args) {
 3                 //获得代理对象
 4         ProxyUservice proxyUservice = new ProxyUservice(new UserServiceImpl());
 5         UserService userviceProxy = proxyUservice.getUserviceProxy();
 6         userviceProxy.save();
 7                 //判断代理对象是被代理对象类型
 8         System.out.println(userviceProxy instanceof UserServiceImpl);
 9     }
10 }            

结果

开启事务
调用dao的保存方法
提交事务
false

cglib代理演示

ublic class Cglibproxy implements MethodInterceptor{
    private UserServiceImpl usi;

    public Cglibproxy(UserServiceImpl usi) {
        super();
        this.usi = usi;
    }
    public  UserService getUserviceProxy(){
        Enhancer en = new Enhancer();//生成代理对象的对象
        en.setSuperclass(UserServiceImpl.class);//cglib代理是继承代理,需要我们指定父类,所以父类不要用final修饰
        en.setCallback(this);//指定增强的内容
        UserServiceImpl userServiceImplProxy = (UserServiceImpl) en.create();//创建代理对象
        return userServiceImplProxy;

    }
    @Override
    public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy arg3) throws Throwable {
        System.out.println("开启事务");
        Object invoke = method.invoke(usi, arg2);//需要指定方法的参数和目标对象
        System.out.println("提交事务");
        return invoke;
    }

}

测试代码

public class ProxyTest2 {
    public static void main(String[] args) {
               //获得代理对象
        Cglibproxy cglibproxy = new Cglibproxy(new UserServiceImpl());
        UserService userviceProxy = cglibproxy.getUserviceProxy();
        userviceProxy.save();
        //判断代理对象是被代理对象类型吗
                System.out.println(userviceProxy instanceof UserServiceImpl);
    }
}    

结果:

开启事务
调用dao的保存方法
提交事务
true

原文地址:https://www.cnblogs.com/xiejiangping/p/9350278.html

时间: 2024-08-01 11:44:31

Sping之AOP思想的相关文章

spring框架学习(四)AOP思想

导包 aop思想介绍 横向重复,纵向抽取 spring中的aop概念 spring实现aop的原理 1.动态代理(优先) 被代理对象必须要实现接口,才能产生代理对象.如果没有接口将不能使用动态代理技术 2.cglib代理(没有接口) 第三方代理技术,cglib代理.可以对任何类生成代理.代理的原理是对目标对象进行继承代理. 如果目标对象被final修饰.那么该类无法被cglib代理. aop名词学习

责任链模式进阶:与AOP思想的融合与应用

摘要: AOP的理念可以很容易抽象出横切关注点,基于AOP理念我们可以将责任链模式中各具体处理角色中共同的实现责任链结构的行为抽象出来并将其模块化,以便进一步提高代码复用率和系统可维护性.实际上,无论是Java Web中的过滤器,还是Struts2中的Interceptor,它们都是责任链模式与AOP思想互相融合的巧妙实践.为了更进一步理解AOP (Aspect-Oriented Programming,AOP) 和 CoR (Chain of Responsibility),本文还概述了Fil

java8的lambdas表达式模拟aop思想,封装一下锁功能

java8的lambdas,其实在编译后,会变为此类中的方法,lambdas表达式只不过是一种简单的语法.lambdas表达式其实就是模拟的c,c++语言中的函数指针,这两个语言都可以把函数当作方法的参数传递,但java中就不行了,因为java中一切都是类,方法必须依附于类而存活. 这就免不了java8之前出现的匿名类.不过java8简化了语法,但和命名类还是有实质的区别.我们可以利用aop思想,封装一下通用逻辑,客户端不必要考虑的非业务逻辑,而那些业务逻辑就可以通过lambdas表达式传入.

第一节: Timer的定时任务的复习、Quartz.Net的入门使用、Aop思想的体现

原文:第一节: Timer的定时任务的复习.Quartz.Net的入门使用.Aop思想的体现 一. 前奏-Timer类实现定时任务 在没有引入第三方开源的定时调度框架之前,我们处理一些简单的定时任务同时都是使用Timer类, DotNet中的Timer类有三个,分别位于不同的命名空间下,分别是: ①.位于System.Windows.Forms里,即定时器控件,不过多介绍了 ②.位于System.Threading.Timer类里 (重点介绍) ③.位于System.Timers.Timer类里

OOP向AOP思想的延伸

最近几天一直在研究AOP.从什么是AOP都不了解的程度开始一点一点的摸索,上网查了很多关于AOP的资料,慢慢消化它. 什么是AOP? AOP是OOP的延续,它是一种面向切面编程,说白了它就是一种思想.说到OOP大家都很熟悉,既然说是OOP的延续,理解起来应该就容易多了. 面向切面编程:即允许通过分离业务逻辑与系统服务进行内聚性开发.对"高内聚,低耦合"的一种实现,实现了调用者与被调用者之间的解耦和. 对比: 首先:AOP和OOP是不同领域的两种思想.  面向对象OOP:对现实世界的抽象

【.NET】AOP思想下的日志功能

AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programming,面向对象编程)的补充和完善. 我们说了这么久的OOP,对于OO的理解也越来越深入,OO的伟大让我们一度折服.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合.可当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力. 也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系.例如日志功能.日

轻松理解AOP思想(面向切面编程)

本文旨在帮助还没有理解AOP的童鞋看透弄懂AOP,也欢迎高手批评指正. 先说一个Spring是什么吧,大家都是它是一个框架,但框架这个词对新手有点抽象,以致于越解释越模糊,不过它确实是个框架的,但那是从功能的角度来定义的,从本质意义上来讲,Spring是一个库,一个Java库,所以我个人觉得应该这样回答Spring是什么:Spring是一个库,它的功能是提供了一个软件框架,这个框架目的是使软件之间的逻辑更加清晰,配置更灵活,实现这个目的的手段使用AOP和IoC,而AOP和IoC是一种思想,是一种

spring aop 思想

springAOP的思想和意义,感觉写的不错,易于理解. AOP(Aspect-Oriented Programming)其实是OOP(Object-Oriented Programing)思想的补充和完善.,OOP引进"抽象"."封装"."继承"."多态"等概念,对万事万物进行抽象和封装,来建立一种对象的层次结构,它强调了一种完整事物的自上而下的关系.但是具体细粒度到每个事物内部的情况,OOP就显得无能为力了.比如日志功能.

理解AOP思想(面向切面编程)

AOP:面向切面编程,相信很多刚接触这个词的同行都不是很明白什么,百度一下看到下面这几句话: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 其