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

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

  • 相关阅读:
    Read Table Binary Search读得field一定要按照Sort的顺序
    Retail Article Master Data 学习 (三) Reference Handling 和 Deviation
    像QQ一样的,好用的Navbar
    sql 脚本执行类
    Page.RegisterRequiresRaiseEvent()与Page.RegisterRequiresPostBack()方法
    ASP.Net实现文件的在线压缩和解压缩
    Word maker! 最大流dinic
    POJ 3258 River Hopscotch 二分查找
    C/C++浮点数在内存中的存储方式《转》
    opencv图像处理8卷积
  • 原文地址:https://www.cnblogs.com/dzh1990/p/13773729.html
Copyright © 2011-2022 走看看