个人理解:可以分离代码,降低方法耦合度,增强方法功能
一、注解方式
package com.sunj.dao;
import org.springframework.stereotype.Repository;
@Repository("userDao2")
public class UserDao {
public void add(){
System.out.println("flag= "+ this.flag);
System.out.println("添加方法1");
}
private boolean flag;
public void setFlag(boolean flag) {
System.out.println("注解构造bean");
this.flag = flag;
}
}
package com.sunj.service;
import com.sunj.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
// @Resource(name = "userDao")
private UserDao userDao1;
public void add(){
// int i = 1/0;
System.out.println("service方法");
userDao1.add();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.sunj"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
package com.sunj.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component //该注解把类实例化到spring容器中
@Aspect
public class TransactionAop {
@Before("execution(* com.sunj.service.UserService.add(..))")
public void begin(){
System.out.println("前置通知");
}
@After("execution(* com.sunj.service.UserService.add(..))")
public void end(){
System.out.println("后置通知");
}
@Around("execution(* com.sunj.service.UserService.add(..))")
public void around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕处理之前");
joinPoint.proceed();
System.out.println("环绕处理之后");
}
/*
该方法在位切面方法未遇到错误时不会执行
*/
@AfterThrowing("execution(* com.sunj.service.UserService.add(..))")
public void meetException() throws Throwable {
System.out.println("异常通知");
}
// @AfterReturning("execution(* com.sunj.service.UserService.add(..))")
// public void returnNo() throws Throwable {
// System.out.println("返回通知");
// }
}
package com.sunj.entity;
import com.sunj.UserController;
import com.sunj.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
public class Test3 {
public static void main(String[] args) {
ApplicationContext applicationContext =new ClassPathXmlApplicationContext("applicationContext2.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.add();
}
}
1、首先需要在xml开启aop注解
2、各注解讲解
1)、@Component 该注解把类实例化到spring容器中
2)、@Aspect, 表示切面
3)、 @Before ,切入点方法之前执行
4)、@After, 切入点方法之后执行
5)、@around,比@Before和@After都晚
6)、@AfterThrowing,切入点方法报错时会执行,不报错则不执行
二、xml方式
1、背景:去掉@Component之后, aop的切面类就不能注入到ioc容器中,所以切面则不会起作用
2、采用xml配置解决
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.sunj"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean id="transactionAop" class="com.sunj.aop.TransactionAop"></bean> <!--注入aop bean -->
<aop:config>
<aop:pointcut expression="execution(* com.sunj.service.UserService.add(..))" id="pt" /> <!-- 切点-->
<aop:aspect ref="transactionAop">
<aop:around method="around" pointcut-ref="pt"/> <!--切入方法 -->
<aop:after-throwing method="meetException" pointcut-ref="pt"/>
<aop:before method="begin" pointcut-ref="pt"/>
<aop:after method="end" pointcut-ref="pt"/>
</aop:aspect>
</aop:config>
</beans>
package com.sunj.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
//@Component //该注解把类实例化到spring容器中
@Aspect
public class TransactionAop {
// @Before("execution(* com.sunj.service.UserService.add(..))")
public void begin(){
System.out.println("前置通知");
}
// @After("execution(* com.sunj.service.UserService.add(..))")
public void end(){
System.out.println("后置通知");
}
// @Around("execution(* com.sunj.service.UserService.add(..))")
public void around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕处理之前");
joinPoint.proceed();
System.out.println("环绕处理之后");
}
/*
该方法在位切面方法未遇到错误时不会执行
*/
// @AfterThrowing("execution(* com.sunj.service.UserService.add(..))")
public void meetException() throws Throwable {
System.out.println("异常通知");
}
}