控制反转又叫做依赖注入
通俗的讲就是
我想吃广东菜,这时需要new 一个广东的厨师A,让A来做菜,有一天我想吃湖南菜 这时就需要new 一个湖南厨师B,让B来做菜
这样就需要我来new 厨师和我之间有耦合
那怎么样解除这个耦合呢
这里就引入了控制反转
我只需要厨师做菜 至于厨师是A还是B我不去控制,有spring去控制
我只需要new 一个厨师类 chushi 我想吃广东菜时 spring就会讲A赋给chushi,当我想吃湖南菜时,spring就会把B赋给chushi
这样就实现了松耦合
Aop 切面编程
AOP使用场景
AOP用来封装横切关注点,具体可以在下面的场景中使用:
-
Authentication 权限
-
Caching 缓存
-
Context passing 内容传递
-
Error handling 错误处理
-
Lazy loading 懒加载
-
Debugging 调试
-
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
-
Performance optimization 性能优化
-
Persistence 持久化
-
Resource pooling 资源池
-
Synchronization 同步
-
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();
}
}
}
运行结果