SpringAOP
SpringAOP:面向切面編程,常見應用場景有權限、事務、控制、日誌等。
SpringAOP的原理:使用cglib代理設計模式。
用註解來模擬一下Spring的AOP
1、創建一個切面類=
/**
* 定義一個切面類
* @author 紫炎易霄
*/
@Component
@Aspect
public class TranAop {
@Before("execution(* com.zyyx.service.UserService.*(..))")
public void before(){
System.out.println("前置通知!");
}
@After("execution(* com.zyyx.service.UserService.*(..))")
public void after(){
System.out.println("後置通知!");
}
@AfterThrowing("execution(* com.zyyx.service.UserService.*(..))")
public void throwing(){
System.out.println("異常通知!");
}
@AfterReturning("execution(* com.zyyx.service.UserService.*(..))")
public void returning(){
System.out.println("返回通知!");
}
@Around("execution(* com.zyyx.service.UserService.*(..))")
public void arounding(ProceedingJoinPoint pJoinPoint) throws Throwable{
System.out.println("環繞通知的開頭!");
pJoinPoint.proceed();
System.out.println("環繞通知的結尾!");
}
}
2、寫一個dao和service
/**
* dao
* @author 紫炎易霄
*/
@Repository
public class UserDao {
public void work(){
System.out.println("我正在執行插入數據的操作!");
}
}
/**
* service
* @author 紫炎易霄
*/
@Service
public class UserService {
@Autowired
private UserDao userDao;
public void work(){
userDao.work();
}
}
3、beans.xml文件的配置
<!-- 開啓dao和service的掃描註解 -->
<context:component-scan base-package="com.zyyx"/>
<!-- 開啓aop註解 -->
<aop:aspectj-autoproxy/>
4、、單元測試
public class TestSpringAop {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) ac.getBean("userService");
userService.work();
}
}
運行結果
用XML來模擬一下Spring的AOP
1、將切面類的註解清空
/**
* 定義一個切面類
* @author 紫炎易霄
*/
public class TranAop {
public void before(){
System.out.println("前置通知!");
}
public void after(){
System.out.println("後置通知!");
}
public void throwing(){
System.out.println("異常通知!");
}
public void returning(){
System.out.println("返回通知!");
}
public void arounding(ProceedingJoinPoint pJoinPoint) throws Throwable{
System.out.println("環繞通知的開頭!");
pJoinPoint.proceed();
System.out.println("環繞通知的結尾!");
}
}
2、配置xml文件
<!-- 開啓dao和service的掃描註解 -->
<context:component-scan base-package="com.zyyx"/>
<bean id="tranAop" class="com.zyyx.aop.TranAop" />
<!-- aop的配置 -->
<aop:config>
<!-- 切入點 -->
<aop:pointcut expression="execution(* com.zyyx.service.UserService.*(..))" id="point"/>
<!-- 切面 -->
<aop:aspect ref="tranAop">
<!-- 通知 -->
<aop:before method="before" pointcut-ref="point"/>
<aop:after method="after" pointcut-ref="point"/>
<aop:after-throwing method="throwing" pointcut-ref="point"/>
<aop:around method="arounding" pointcut-ref="point"/>
<aop:after-returning method="returning" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
運行結果