zoukankan      html  css  js  c++  java
  • java框架篇---spring aop两种配置方式

    第一种:注解配置AOP

    注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 
    1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before, @AfterReturning,@After,@AfterThrowing,@Around). 
    2. 开发需要被拦截的类。 
    3. 将切面配置到xml中,当然,我们也可以使用自动扫描Bean的方式。这样的话,那就交由Spring AoP容器管理。 

    另外需要引用 aspectJ 的 jar 包: aspectjweaver.jar aspectjrt.jar 

    实例:

    User.java
    复制代码
    package com.oumyye.model;
    
    public class User {
        private String username;
        private String password;
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
    }
    复制代码
    复制代码
    /**
    *接口类
    */
    package com.oumyye.dao; import com.oumyye.model.User; public interface UserDAO { public void save(User user); }
    复制代码

    实现接口:

    复制代码
    package com.oumyye.dao.impl;
    
    import org.springframework.stereotype.Component;
    
    import com.oumyye.dao.UserDAO;
    import com.oumyye.model.User;
    
    @Component("u")
    public class UserDAOImpl implements UserDAO {
    
        public void save(User user) {
            
            System.out.println("user save11d!");
            /*throw new RuntimeException("exception");*/ //抛异常
        }
    
    }
    复制代码

    操作类:

    复制代码
    package com.oumyye.service;
    import javax.annotation.Resource;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
    
    import com.oumyye.dao.UserDAO;
    import com.oumyye.model.User;
    
    
    @Component("userService")
    public class UserService {
        
        private UserDAO userDAO;  
        
        public void init() {
            System.out.println("init");
        }
        
        public void add(User user) {
            userDAO.save(user);
        }
        public UserDAO getUserDAO() {
            return userDAO;
        }
        
        @Resource(name="u")
        public void setUserDAO( UserDAO userDAO) {
            this.userDAO = userDAO;
        }
       
        public void destroy() {
            System.out.println("destroy");
        }
    }
    复制代码

    加入aop

    复制代码
    package com.oumyye.aop;
    
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class LogInterceptor {
        @Pointcut("execution(public * com.oumyye.service..*.add(..))")
        public void myMethod(){};
        
        /*@Before("execution(public void com.oumyye.dao.impl.UserDAOImpl.save(com.oumyye.model.User))")*/
        @Before("myMethod()")
        public void before() {
            System.out.println("method staet");
        } 
        @After("myMethod()")
        public void after() {
            System.out.println("method after");
        } 
        @AfterReturning("execution(public * com.oumyye.dao..*.*(..))")
        public void AfterReturning() {
            System.out.println("method AfterReturning");
        } 
        @AfterThrowing("execution(public * com.oumyye.dao..*.*(..))")
        public void AfterThrowing() {
            System.out.println("method AfterThrowing");
        } 
    }
    复制代码

    配置文件

    复制代码
    <?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-2.5.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd
               http://www.springframework.org/schema/aop            
               http://www.springframework.org/schema/aop/spring-aop-3.1.xsd  
               "><!-- 要添加最后2行 -->
               
        <context:annotation-config />
        <context:component-scan base-package="com.oumyye"/>  <!-- 自动扫描 -->
        <aop:aspectj-autoproxy/>  <!-- 要添加本行 -->
    </beans>
    复制代码

    测试类:

    复制代码
    package com.oumyye.service;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.oumyye.model.User;
    
    //Dependency Injection
    //Inverse of Control
    public class UserServiceTest {
    
        @Test
        public void testAdd() throws Exception {
            ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            
            
            UserService service = (UserService)ctx.getBean("userService");
            System.out.println(service.getClass());
            service.add(new User());
            System.out.println("###");
            
            ctx.destroy();
            
        }
    
    }
    复制代码

    结果:

    class com.oumyye.service.UserService$$EnhancerByCGLIB$$7b201784
    method staet
    user save11d!
    method AfterReturning
    method after
    ###

    注意:

    • @Aspect:意思是这个类为切面类  
    • @Componet:因为作为切面类需要 Spring 管理起来,所以在初始化时就需要将这个类初始化加入 Spring 的管理;  
    • @Befoe:切入点的逻辑(Advice)
    • execution…:切入点语法 

    第二种:xml配置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: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/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd
               http://www.springframework.org/schema/aop            
               http://www.springframework.org/schema/aop/spring-aop-3.1.xsd  
               "><!-- 要添加最后2行 -->
               
        <context:annotation-config />
        <context:component-scan base-package="com.oumyye"/>
        <bean id="logInterceptor" class="com.oumyye.aop.LogInterceptor"></bean>
        <aop:config>
            <aop:pointcut expression="execution(public * com.oumyye.service..*.add(..))" 
            id="servicePointcut"/>
            <aop:aspect id="logAspect" ref="logInterceptor">
                <aop:before method="before"  pointcut-ref="servicePointcut" />
            </aop:aspect>
            
        </aop:config>
    </beans>
    复制代码

    下面的<beans>是Spring的配置标签,beans里面几个重要的属性

      xmlns:

      是默认的xml文档解析格式,即spring的beans。地址是http://www.springframework.org/schema/beans。

      通过设置这个属性,所有在beans里面声明的属性,可以直接通过<>来使用,比如<bean>等等。

      xmlns:xsi:

      是xml需要遵守的规范,通过URL可以看到,是w3的统一规范,后面通过xsi:schemaLocation来定位所有的解析文件。

      xmlns:aop:

      这个是重点,是我们这里需要使用到的一些语义规范,与面向切面AOP相关。

      xmlns:tx:

      Spring中与事务相关的配置内容。

      一个XML文件,只能声明一个默认的语义解析的规范。

      例如上面的xml中就只有beans一个是默认的,其他的都需要通过特定的标签来使用,比如aop,它自己有很多的属性,如果要使用,前面就必须加上aop:xxx才可以。比如上面的aop:config。

      类似的,如果默认的xmlns配置的是aop相关的语义解析规范,那么在xml中就可以直接写config这种标签了。

  • 相关阅读:
    ThinkPHP 3.2.2 实现持久登录 ( 记住我 )
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 17 电话号码的字母组合
  • 原文地址:https://www.cnblogs.com/chenhceng/p/7677708.html
Copyright © 2011-2022 走看看