• spring学习3-第一次测试成功


     参考 

    http://www.it165.net/pro/html/201407/18718.html

    http://xtu-xiaoxin.iteye.com/blog/630206

    http://m.blog.csdn.net/blog/zl3450341/6013727

    目标对象类

    package com.chuiyuan;
    
    public interface Employee {
    	public void signIn ();
    }
    

    实现为

    package com.chuiyuan;
    
    public class CommonEmployee implements Employee {
    	private String name  ;
    	
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	@Override
    	public void signIn() {
    		System.out.println(name+"已经签到");
    	}
    	
    }
    

     通知类

    然后编写通知类AspectJLogger.java,在该通知类里,通过注入的形式来定义切面、通知以及通知所左右的切点,具体如下: 

    package com.chuiyuan;
    
    import java.util.Date;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    /** 
     * 使用@Aspect 注解的类, Spring 将会把它当作一个特殊的Bean(一个切面),也就是 
     * 不对这个类本身进行动态代理 
     */  
    @Aspect
    public class AspectJLogger {
    	 /** 
         * 必须为final String类型的,注解里要使用的变量只能是静态常量类型的 
         */  
        public static final String EDP = "execution( public * *(..))"; 
        
        @Before(EDP)
        public void logBefore(){
        	 System.out.println("logBefore:现在时间是:"+new Date());  
        }
        
        @After(EDP)    //spring中After通知  
        public void logAfter() {  
            System.out.println("logAfter:现在时间是:"+new Date());  
        }  
        
        @Around(EDP)
        public Object logAround(ProceedingJoinPoint joinPoint){
        	 System.out.println("logAround开始:现在时间是:"+new Date()); //方法执行前的代理处理  
             Object[] args = joinPoint.getArgs();  
             Object obj = null;  
             try {  
                 obj = joinPoint.proceed(args);  
             } catch (Throwable e) {  
                 e.printStackTrace();  
             }  
             System.out.println("logAround结束:现在时间是:"+new Date());  //方法执行后的代理处理  
             return obj;
        }
        
    }
    

    配置文件

    <?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"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    		http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/aop 
    		http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    		http://www.springframework.org/schema/context 
    		http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    	
        <aop:aspectj-autoproxy/> 
        <bean id="aspect" class="com.chuiyuan.AspectJLogger" />
        <bean id="employee" class="com.chuiyuan.CommonEmployee">
          <property name="name" value="lsj"></property>
        </bean>
    
    </beans>
    

    测试类

    package com.chuiyuan;
    
    import org.springframework.beans.factory.support.DefaultListableBeanFactory;
    import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;
    
    public class Test {
    	public static void main(String [] args){
    		Resource res = new ClassPathResource("applicationContext.xml");
    		DefaultListableBeanFactory factory= new DefaultListableBeanFactory ();
    		XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
    		reader.loadBeanDefinitions(res);
    		//如果用factory好像不行
    		ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");  
    		
    		Employee employee= (Employee) act.getBean("employee") ;
    		employee.signIn(); 
    		
    	}  
    }
    

    结果

    六月 27, 2015 12:14:27 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    信息: Loading XML bean definitions from class path resource [applicationContext.xml]
    六月 27, 2015 12:14:28 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
    信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1b1a17a: startup date [Sat Jun 27 12:14:28 CST 2015]; root of context hierarchy
    六月 27, 2015 12:14:28 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    信息: Loading XML bean definitions from class path resource [applicationContext.xml]
    logAround开始:现在时间是:Sat Jun 27 12:14:28 CST 2015
    logBefore:现在时间是:Sat Jun 27 12:14:28 CST 2015
    lsj已经签到
    logAround结束:现在时间是:Sat Jun 27 12:14:28 CST 2015
    logAfter:现在时间是:Sat Jun 27 12:14:28 CST 2015

    一些注意的知识

    1.环绕方法通知,环绕方法通知要注意必须给出调用之后的返回值,否则被代理的方法会停止调用并返回null,除非你真的打算这么做。                    

    2.只有环绕通知才可以使用JoinPoint的子类ProceedingJoinPoint,个 连接点类型可以调用代理的方法,并获取、改变返回值。   

      

      

  • 相关阅读:
    五分钟小知识:为什么要分稳定排序和非稳定排序?
    spring boot——配置文件——Spring Boot Profile(多环境配置)——多 Profile 文件方式——properties 配置
    Osquery检测入侵痕迹——这玩意适合在agent端侧使用啊
    2021 fireeye apt攻击报告
    PostgreSQL 使用citd删除重复行 规格严格
    Go Web编程深入学习解析HTTP请求
    网速成为了工作的瓶颈之一
    进销存成本的影响因素
    系统升级时,数据库脚本执行注意事项,血的教训
    进销存系统的成本核算方法一览
  • 原文地址:https://www.cnblogs.com/chuiyuan/p/4603368.html
Copyright © 2020-2023  润新知