zoukankan      html  css  js  c++  java
  • Spring AOP

    研读了下有关Spring AOP的blog:

    1. http://blog.csdn.net/wuxinzaiyu/article/details/8608394

    2. http://snowolf.iteye.com/blog/1481442

    Spring AOP的底层实现使用的是JDK动态代理(针对implements接口的类) / CGLib动态代理(针对未实现接口的类)。总体来说,Spring AOP使用起来比较容易。分XML配置和注解两种方式。

    目前自己的使用方式有两种(均为注解方式):

    1. XML中增加<aop:aspectj-autoproxy/> ; 在代理类上添加@Aspect注解

    2. 在代理类上添加@EnableAspectJAutoProxy@Aspect

    采用第二种方式时,有以下参考实例:

    1. 接口和实现:

    public interface UserDAO {
        public void save(User user);
    }
    public class UserDAOImpl implements UserDAO {
        @Override
        public void save(User user) {
            System.out.println("save start...");
        }
    }

    2. 代理类:

    @EnableAspectJAutoProxy
    @Aspect
    @Component
    public class LogInterceptor {
    
        @Before(value = "execution(public void foo.bar.dao.Impl.UserDAOImpl.save(foo.bar.entity.User))")
        public void before(){
            System.out.println("before method...");
        }
    }

    3. spring-config.xml

    <?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: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.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop.xsd">
        <context:annotation-config />
        <context:component-scan base-package="foo.bar"/>
        <!--<aop:aspectj-autoproxy/>-->
        <bean id="userDAO" class="foo.bar.dao.Impl.UserDAOImpl"/>
    </beans>

    4. Test

    public class Main {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
            UserDAO userDAO = (UserDAO)context.getBean(UserDAO.class);
            User user = new User();
            userDAO.save(user);
        }
    }

    5. 测试结果:

    before method...
    save start...

    注意:Spring AOP只能对Spring管理的beans起作用!!!也就是说,Spring AOP对人为new的对象不起任何作用。

    XML配置Spring AOP方式(推荐),原因:Spring中有很多已经写好的切面类,如果调用这些,只能通过XML配置Pointcut。

    实例:

    先去掉以上第2步中的注解,并将xml文件修改如下:

    <?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: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.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop.xsd">
        <context:annotation-config />
        <context:component-scan base-package="foo.bar"/>
        <bean id="userDAO" class="foo.bar.dao.Impl.UserDAOImpl"/>
        <bean id="logIntercept" class="foo.bar.proxy.LogInterceptor"/>
        
        <aop:config>
            <aop:pointcut id="log"
                          expression="execution(public void foo.bar.dao.Impl.UserDAOImpl.save(foo.bar.entity.User))"/>
            <aop:aspect id="logAspect" ref="logIntercept">
                <aop:before method="before" pointcut-ref="log"/>
            </aop:aspect>
        </aop:config>
    
    </beans>

    基本上一看就明白。

    -----------------------------------------------------------------------------------------------------------------

    1. 注解方式使用Spring AOP:

      1. XML中添加<aop:aspectj-autoproxy/>

      2. 定义切面类LogInterpetor

      3. 切面类上添加注解@Aspect和@Component

      4. 定义切面@Pointcut及Advice

     2. XML方式使用Spring AOP:

      1. 实例化切面类

      2. 配置aop:configaop:pointcutaop:aspect 以及各种Advice

    清醒时做事,糊涂时读书,大怒时睡觉,独处时思考; 做一个幸福的人,读书,旅行,努力工作,关心身体和心情,成为最好的自己 -- 共勉
  • 相关阅读:
    [CLRS][CH 19]斐波那契堆
    [CLRS][CH 20] van Emde Boas 树
    [C++11] lambda函数
    常用网站整理
    词法分析原理 Lexical Analysis
    ie8开发人员工具无法使用,按f12任务栏里出现任务,但是窗体不弹出
    IE6下zindex犯癫不起作用bug的初步研究(转)
    ie8无法浏览png格式图片
    jquery.pngFix在最新的jquery1.7上无效的问题解决方法!
    用clearfix:after消除(DIV块因内部浮动而高度收缩的问题)(转)
  • 原文地址:https://www.cnblogs.com/hello-yz/p/4752797.html
Copyright © 2011-2022 走看看