zoukankan      html  css  js  c++  java
  • java spring 控制反转 和AOP

    控制反转又叫做依赖注入

    通俗的讲就是

    我想吃广东菜,这时需要new 一个广东的厨师A,让A来做菜,有一天我想吃湖南菜 这时就需要new 一个湖南厨师B,让B来做菜

    这样就需要我来new 厨师和我之间有耦合

    那怎么样解除这个耦合呢

    这里就引入了控制反转

    我只需要厨师做菜 至于厨师是A还是B我不去控制,有spring去控制 

    我只需要new 一个厨师类  chushi  我想吃广东菜时 spring就会讲A赋给chushi,当我想吃湖南菜时,spring就会把B赋给chushi

    这样就实现了松耦合

    Aop 切面编程

    AOP使用场景

    AOP用来封装横切关注点,具体可以在下面的场景中使用:

    1. Authentication 权限

    2. Caching 缓存

    3. Context passing 内容传递

    4. Error handling 错误处理

    5. Lazy loading 懒加载

    6. Debugging 调试

    7. logging, tracing, profiling and monitoring 记录跟踪 优化 校准

    8. Performance optimization 性能优化

    9. Persistence 持久化

    10. Resource pooling 资源池

    11. Synchronization 同步

    12. Transactions 事务

    需要的jar包
    aspectjrt-1.9.2.jar、aspectjweaver-1.9.2.jar

    日志类LogAop.java

    package cn.com.demo.aop;
    
    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;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    
    @Component
    @Aspect
    public class LogAop {
    
    	@Pointcut("execution(* cn.com.demo.service.UserService.insertUser(..))")
    	public void ponitCut() {
    		
    	}
    	
    	@Before("ponitCut()")
    	public void beforeAdvice() {
    		System.out.println("beforeAdvice");
    	}
    	
    	@After("ponitCut()")
    	public void afterAdvice() {
    		System.out.println("afterAdvice");
    	}
    	
    	//环绕通知。注意要有ProceedingJoinPoint参数传入
    	@Around("ponitCut()")
    	public void around(ProceedingJoinPoint pjp) throws Throwable {
    		System.out.println("注解类型环绕通知..环绕前");
    		pjp.proceed();//执行方法
    		System.out.println("注解类型环绕通知..环绕后");
    	}
    }

    UserService.java

    package cn.com.demo.service;
    
    public class UserService {
    
    	public void insertUser() {
    		System.out.println("插入用户成功");
    	}
    	
    	public boolean updateUser() {
    		System.out.println("更新用户成功");
    		return true;
    	}
    }
    

    测试类TestAop

    package cn.com.demo.test;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import cn.com.demo.service.UserService;
    
    public class TestAop {
    	
    	private ClassPathXmlApplicationContext ac;
    
    	@Before
    	public void before() {
    		ac = new ClassPathXmlApplicationContext("*/applicationContext.xml");
    	}
    	
    	@Test
    	public void test() {
    		try {
    			UserService userService = (UserService) ac.getBean("userService");
    			userService.insertUser();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }

    运行结果
    在这里插入图片描述

  • 相关阅读:
    aul 学习测试(测量)
    ubuntu12.04下一个samba、tftp、nfs构造
    Linux互斥和同步应用程序(一):posix线程和线程之间的相互排斥
    Cocos2d-x加速度计
    事务处理和并发控制
    【通过做专题研习Android】知识点:SharedPreferences
    数据结构 --- 单人名单
    安德鲁斯 建立与各种听众自己定义的ScrollView
    【iOS开展-94】xcode6如何使用GIT以及如何添加太老项目GIT特征?
    2013年第35周一
  • 原文地址:https://www.cnblogs.com/dzh1990/p/13773729.html
Copyright © 2011-2022 走看看