zoukankan      html  css  js  c++  java
  • 马士兵Spring-AOP-XML配置(2)

    一、

    UserDAO.java:

    package com.cy.dao;
    
    import com.cy.model.User;
    
    public interface UserDAO {
        public void save(User user);
    }
    View Code

    实现UserDAOImpl.java:

    package com.cy.dao.impl;
    
    import org.springframework.stereotype.Component;
    
    import com.cy.dao.UserDAO;
    import com.cy.model.User;
    
    @Component
    public class UserDAOImpl implements UserDAO {
    
        public void save(User user) {
            //Hibernate
            //JDBC
            //XML
            //NetWork
            System.out.println("user saved!");
        }
    
    }
    View Code

    切面类LogInterceptor.java:

    package com.cy.aop;
    
    public class LogInterceptor {
        
        public void before() {
            System.out.println("method before");
        }
        
    }
    View Code

    UserService.java:

    package com.cy.service;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Component;
    
    import com.cy.dao.UserDAO;
    import com.cy.model.User;
    
    @Component("userService")
    public class UserService {
        
        @Resource
        private UserDAO userDAO;  
        
        public void init() {
            System.out.println("init");
        }
        
        public void add(User user) {
            userDAO.save(user);
        }
        
        
        public UserDAO getUserDAO() {
            return userDAO;
        }
        
        public void setUserDAO( UserDAO userDAO) {
            this.userDAO = userDAO;
        }
        
        public void destroy() {
            System.out.println("destroy");
        }
    }
    View Code

    配置文件beans.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-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-2.5.xsd">
               
        <context:annotation-config />
        <context:component-scan base-package="com.cy"/>
        
        <!-- 把切面类在容器中初始化
             这是一个切面逻辑类的对象    
         -->
        <bean id="logInteceptor" class="com.cy.aop.LogInterceptor"></bean>
        
        <!-- 
            aop:config  aop配置
            aop:pointcut: 声明一个切面,在service的add方法上面加入我们切进来的各种逻辑;给这个切面起名为servicePointcut
                            在aop:config下面定义了一个全局的pointCut,可以在所有的aop:aspect上面使用;
                          (可以添加这种全局的pointCut,也可以在aop:aspect下面添加pointCut,后者只能在这个aspect下面使用)
            
            aop:aspect:   声明切面对象;它所参考的切面类的对象是logInteceptor
            aop:before:  在切面servicePointcut之前执行logInteceptor的before方法
         -->
        <aop:config>
            <aop:pointcut id="servicePointcut" expression="execution(public * com.cy.service..*.add(..))"/>
            <aop:aspect id="logAspect" ref="logInteceptor">
                <aop:before method="before" pointcut-ref="servicePointcut"/>
            </aop:aspect>
        </aop:config>
        
     
    </beans>

    测试代码:

    UserServiceTest.java:

    package com.cy.service;
    
    import org.junit.Test;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.cy.model.User;
    
    public class UserServiceTest {
        
        @Test
        public void testAdd() throws Exception {
            ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
            UserService service = (UserService)ctx.getBean("userService");
            System.out.println(service.getClass());
            service.add(new User());
            ctx.destroy();
        }
    }
    View Code

    console:

    二、第2个例子:

    pointcut可以直接定义在aop:before/aop:after等这些advice里面:

    beans.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-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-2.5.xsd">
               
        <context:annotation-config />
        <context:component-scan base-package="com.cy"/>
    
        <bean id="logInteceptor" class="com.cy.aop.LogInterceptor"></bean>
    <aop:config> <aop:aspect id="logAspect" ref="logInteceptor"> <aop:before method="before" pointcut="execution(public * com.cy.service..*.add(..))"/> </aop:aspect> </aop:config> </beans>

    console同样的运行效果;

    三、aop:advisor这个放在声明式事务管理中写;

    总结:

  • 相关阅读:
    libevent中的基本数据结构---queue.h
    TCP 连接关闭及TIME_WAIT探究
    网络程序中常用的三种心跳机制----服务器端
    TCP程序中发送和接收数据
    如何编写一个稳定的网络程序(TCP)
    Linux 编程--三种常用的定时器
    Libevent 事件循环(2)---事件被加入激活队列
    单机千万并发连接实战(修订版)
    千万并发连接实战
    kqueue例子
  • 原文地址:https://www.cnblogs.com/tenWood/p/6864741.html
Copyright © 2011-2022 走看看