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

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

posted on 2021-04-13 10:04  dzh1990  阅读(73)  评论(0编辑  收藏  举报