标签:artifact on() 手动 注入 部分 lap point fun static
Aop:指程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式。
1、导入aop模块;Spring AOP:(spring-aspects)
2、定义一个业务逻辑类(UserServiceImpl);在业务逻辑运行的时候将日志进行打印包括在(方法运行的之前,运行结束,运行异常等)
3、定义一个日志切面类(LogAspect):切面类里面的方法需要动态感知UserServiceImpl运行到哪里然后执行;
通知方法:
前置通知(``@Before``):logStart:在目标方法运行之前运行
后置通知(``@After``):logEnd:在目标方法运行结束之后运行(无论方法正常结束还是异常结束)
返回通知(``@AfterReturning``):logReturn:在目标方法正常返回之后运行
异常通知(``@AfterThrowing``):logException:在目标方法出现异常以后运行
环绕通知(``@Around``):动态代理,手动推进目标方法运行。
4、给切面类的目标方法标注何时何地运行(通知注解);
5、将切面类和业务逻辑类(目标方法所在类)都加入到容器中;
6、必须告诉Spring哪个类是切面类(@Aspect)
7、给配置类中加 @EnableAspectJAutoProxy
导入spring-aspects的jar包:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
业务类(UserServiceImpl)
public class UserServiceImpl {
public String loginUser(String username,String password) {
System.out.println("用户登录成功~~~~~~~");
return "登录成功";
}
}
在定义切面之前我们说一下Aspectj切入点语法定义
在我们使用Spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义切入点(Pointcut)。
例如定义切入点表达式 _execution ( zfcoding.service….(…))_*
execution()是最常用的切点函数,其语法如下所示:
整个表达式可以分为五个部分:
切面类(LogAspect)
@Aspect
public class LogAspect {
//定义切面的执行规规则
@Pointcut("execution (* zfcoding.service..*.*(..))")
public void pointCut() {
}
@Before("pointCut()")
public void logStart() {
System.out.println("登录开始通知");
}
@After("pointCut()")
public void logEnd() {
System.out.println("登录结束通知");
}
@AfterReturning("pointCut()")
public void logReturn() {
System.out.println("返回通知");
}
@AfterThrowing("pointCut()")
public void logException() {
System.out.println("异常通知");
}
}
将业务类和切面类注入到Spring容器当中,使用@EnableAspectJAutoProxy开启注解的Aop 功能
@Configuration //配置类
@EnableAspectJAutoProxy //开启注解的Aop 功能
public class MyConfigAspect {
@Bean //bean注入到Spring容器当中
public UserServiceImpl userService() {
return new UserServiceImpl();
}
@Bean
public LogAspect logAspect() {
return new LogAspect();
}
}
测试类:
public class AspectTest {
@Test
public void test(){
AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(MyConfigAspect.class);
UserServiceImpl bean = applicationContext.getBean(UserServiceImpl.class);
bean.loginUser("admin","123");
}
}
运行结果:
登录开始通知
用户登录成功~~~~~~~
登录结束通知
返回通知
[@Aspect](https://my.oschina.net/aspect)
)首先需要也是需要定义一个业务类和一个配置类,然后定义一个配置类,配置类实现的功能主要是将业务类和切面类注入到Spring容器当中,定义一些切面的配置。
基于Xml的Aop 代码实现:
业务类和上面注解实现一样,同上
切面类
public class LogAspectXml {
public void logStart() {
System.out.println("登录开始通知");
}
public void logEnd() {
System.out.println("登录结束通知");
}
public void logReturn() {
System.out.println("返回通知");
}
public void logException() {
System.out.println("异常通知");
}
}
配置类:
<?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 http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--注入bean-->
<bean id="logAspectXml" class="zfcoding.aop.LogAspectXml"></bean>
<bean id="userServiceImplXml" class="zfcoding.service.UserServiceImplXml"></bean>
<aop:config>
<aop:aspect ref="logAspectXml">
<aop:pointcut id="pointCut" expression="execution (* zfcoding.service..*.*(..))"/>
<aop:before method="logStart" pointcut-ref="pointCut"></aop:before>
<aop:after method="logEnd" pointcut-ref="pointCut"></aop:after>
<aop:after-returning method="logReturn" pointcut-ref="pointCut"></aop:after-returning>
<aop:after-throwing method="logException" pointcut-ref="pointCut"></aop:after-throwing>
</aop:aspect>
</aop:config>
</beans>
测试类
public class AspectTestXml {
@Test
public void test(){
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("classpath:spring-aop-xml.xml");
UserServiceImplXml userServiceImplXml =(UserServiceImplXml) applicationContext.getBean("userServiceImplXml");
userServiceImplXml.loginUser("aa","aa");
}
}
运行结果
登录开始通知
用户登录成功~~~~~~~
登录结束通知
返回通知
我是阿福,公众号「阿福聊编程」作者,对后端技术保持学习爱好者,我会经常更新JAVA技术文章,在进阶的路上,共勉!
欢迎大家关注我的公众号,后台回复666,领取福利,你懂的。
标签:artifact on() 手动 注入 部分 lap point fun static
原文地址:https://www.cnblogs.com/vwvwvwgwg/p/13170983.html