1.文件目录:
2.实体类
package com.wangcf.po; public class User { private int id; private String name; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
3.接口:
package com.wangcf.manager; import com.wangcf.po.User; public interface IUserManager { public void addUser(); public void addUser(User user); public void delUser(int uid); public User modifyUser(User user); }
4.实现类:
package com.wangcf.manager; import com.wangcf.po.User; public class UserManagerImp implements IUserManager{ @Override public void addUser() { // TODO Auto-generated method stub System.out.println("UserManagerImp addUser.."); } @Override public void delUser(int uid) { // TODO Auto-generated method stub System.out.println("UserManagerImp delUser.."); } @Override public User modifyUser(User user) { // TODO Auto-generated method stub user.setName(user.getName()+",修改后的"); System.out.println("UserManagerImp modifyUser.."); return null; } @Override public void addUser(User user) { // TODO Auto-generated method stub System.out.println("UserManagerImp addUser(User user)..."); } }
5.切面:
package com.wangcf.manager.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect /** * 切面类 * @author fan * */ public class LogManager { @Before("execution(public void com.wangcf.manager.UserManagerImp.addUser())") /*addUser(..)表示带参数或不带参数 * add*() 可以用通配符进行修饰 * execution为切入点的指示符,还有其他的 * advice(通知) */ public static void addLogBefore(){ System.out.println("添加日志 Before..."); } @After("execution(* com.wangcf.manager.*.*(..))") public void addLogAfter(){ System.out.println("添加日志记录 After..."); } @AfterReturning("execution(* com.wangcf.manager.*.*(..))") public void addLogAfterReturning(){ System.out.println("添加日志记录 AfterReturning..."); } @AfterThrowing("execution(* com.wangcf.manager.*.*(..))") public void addLogAfterThrowing(){ System.out.println("添加日志记录 AfterThrowing..."); } @Around("execution(* com.wangcf.manager.*.*(..))") public void addLogAround(JoinPoint joinPoint){ System.out.println("添加日志记录 AfterAround start..."); System.out.println(joinPoint.getTarget()); System.out.println("添加日志记录 AfterAround end..."); } }
6.测试类:
package com.wangcf.test; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.wangcf.manager.IUserManager; import com.wangcf.po.User; public class TestAction { public static void main(String[] args) { BeanFactory factory=new ClassPathXmlApplicationContext("applicationContext.xml"); IUserManager userManager=(IUserManager) factory.getBean("userManager"); userManager.addUser(); System.out.println("================="); User user=new User(); user.setName("张三") ; userManager.addUser(user); System.out.println("========"); userManager.modifyUser(null); } }
7.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:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <bean name="userManager" class="com.wangcf.manager.UserManagerImp"/> <bean name="logManager" class="com.wangcf.manager.aspect.LogManager"/> <!--启用AspectJ的支持 --> <aop:aspectj-autoproxy/> </beans>
8.输出
9.总结:
在xml配置中会生成代理类
在使用SpringAOP的时候,业务类需要实现接口,不然就需要使用CGLIB生成目标对象的代理类
Spring会自动选择用何种方式处理代理:
1.JDK动态代理:当目标对象实现了接口的时候
2.CGLIB的代理:当目标对象没有实现接口的时候
可以强制使用CGLIB来生成代理:
<aop:aspectj-autoproxy proxy-target-class="true"/>