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();
    		}
    	}
    }

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

  • 相关阅读:
    用protobuf编译时报错:protoc: error while loading shared libraries: libprotoc.so.9: cannot open shared object file: No such file or directory 的解决方法
    编译dubbo2.5.4时遇到的问题及解决
    在ubuntu16.04 下安装haproxy 1.5.11 做tcp负载均衡
    [原创] zabbix学习之旅七:如何远程操作被监控机器
    [原创] zabbix学习之旅五:如何快速搭建一个报警系统
    [原创] zabbix学习之旅四:mail客户端安装
    [原创] zabbix学习之旅三:agent安装
    [原创] zabbix学习之旅二:yum安装
    scipy 中关于排列组合的函数
    极大似然估计 (二)
  • 原文地址:https://www.cnblogs.com/dzh1990/p/13773729.html
Copyright © 2011-2022 走看看