文章目录
依赖导入:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
1.通过实现接口定义增强
1.创建接口
public interface UserDao {
public void addUser();
public void delete();
public void update();
}
2.常见实现类实现接口
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
System.out.println(“添加用户”);
}
@Override
public void delete() {
System.out.println("删除用户");
}
@Override
public void update() {
System.out.println("修改用户");
}
}
3.前置增强
需要实现MethodBeforeAdvice接口
public class LogBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("执行前置方法 添加执行方法前需要做的事");
// method.invoke(, )
}
}
4.后置增强
需要实现 AfterReturningAdvice接口
public class LogAfterAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
System.out.println("执行后置通知");
}
}
5.在Spring配置文件配置
<!--目标对象实例-->
<bean id="userDao" class="aop.UserDaoImpl"/>
<!--advice增强实例-->
<bean id="logBeforeAdvice" class="aop.LogBeforeAdvice"/>
<bean id="logAfterAdvice" class="aop.LogAfterAdvice"/>
<bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--代理的接口-->
<property name="proxyInterfaces">
<list>
<value>aop.UserDao</value>
</list>
</property>
<!--目标对象实例-->
<property name="target" ref="userDao"/>
<property name="interceptorNames">
<list>
<!--增强实例 可以有多个-->
<!--前置-->
<value>logBeforeAdvice</value>
<!--后置-->
<value>logAfterAdvice</value>
</list>
</property>
</bean>
6.通过Spring提供的advisor增强
<!--目标对象实例-->
<bean id="userDao" class="aop.UserDaoImpl"/>
<!--增强-->
<bean id="logAroundAdvice" class="aop.LogAroundAdvice"/>
<!--通过Spring提供的NameMatchMethodPointcutAdvisor类-->
<bean id="logAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="logAroundAdvice"/>
<property name="mappedNames">
<!--指定需要增强的方法-->
<list>
<value>add*</value>
<value>update*</value>
<value>delete*</value>
</list>
</property>
</bean>
<bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--代理的接口-->
<property name="proxyInterfaces">
<list>
<value>aop.UserDao</value>
</list>
</property>
<!--目标对象实例-->
<property name="target" ref="userDao"/>
<property name="interceptorNames">
<list>
<value>logAdvisor</value>
</list>
</property>
</bean>
指定了仅调用add、update、delete开头的方法时才执行增强
如 执行addUser方法时,打印了增强内容中的信息
执行findUser方法时,不打印增强信息
2.通过配置文件实现增强
1.接口定义
public interface UserDao {
public void addUser();
public void deleteUser();
public void updateUser();
public void findUser();
}
2.接口实现
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
System.out.println("添加用户");
}
@Override
public void deleteUser() {
System.out.println("删除用户");
}
@Override
public void updateUser() {
System.out.println("修改用户");
}
@Override
public void findUser() {
System.out.println("查询用户");
}
}
3.切面类
此处需要导入依赖
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.4</version>
</dependency>
public class LogBeforeAdvice {
public void before(JoinPoint jp) {
System.out.println("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName() + " 方法。方法入参:" + Arrays.toString(jp.getArgs()));
}
}
4.配置
<?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.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--目标对象实例-->
<bean id="userDao" class="aop.UserDaoImpl"/>
<!--增强-->
<bean id="logBeforeAdvice" class="aop.LogBeforeAdvice"/>
<aop:config>
<!--切点-->
<aop:pointcut id="pointcut" expression="execution(* aop.UserDao.*(..))"/>
<aop:aspect ref="logBeforeAdvice">
<!--切入方式 这里是前置增强-->
<aop:before method="before" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
</beans>
5.测试
public class TestAdvice {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring*.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.addUser();
userDao.findUser();
}
}
3.注解方式
1.接口
public interface UserDao {
public void addUser();
public void deleteUser();
public void updateUser();
public void findUser();
}
2.实现类
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
System.out.println("添加用户");
}
@Override
public void deleteUser() {
System.out.println("删除用户");
}
@Override
public void updateUser() {
System.out.println("修改用户");
}
@Override
public void findUser() {
System.out.println("查询用户");
}
}
3.切面类
@Aspect
public class LogBeforeAdvice {
@Before("execution(public * addUser(..))")
public void before(JoinPoint jp) {
System.out.println("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName() + " 方法。方法入参:" + Arrays.toString(jp.getArgs()));
//System.out.println("显示日志功能。。。。");
}
}
4.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.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--目标对象实例-->
<bean id="userDao" class="aop.UserDaoImpl"/>
<!--增强-->
<bean id="logBeforeAdvice" class="aop.LogBeforeAdvice"/>
<aop:aspectj-autoproxy/>
</beans>
5.测试
public class TestAdvice {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring*.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.addUser();
userDao.findUser();
}
}
结果与上面相同
推荐使用最后一种方式。