用花生壳做映射的网站需要备案,化工网站建设价格,wordpress 文档预览,搭建个人网站✅作者简介#xff1a;正在学习java全栈,有兴趣的可以关注我一起学习 #x1f4c3;个人主页#xff1a;ConderX(摸鱼)的主页 #x1f525;系列专栏#xff1a;Spring专栏 #x1f496;如果觉得博主的文章还不错的话#xff0c;请#x1f44d;三连支持一下博主哦#x…✅作者简介正在学习java全栈,有兴趣的可以关注我一起学习 个人主页ConderX(摸鱼)的主页 系列专栏Spring专栏 如果觉得博主的文章还不错的话请三连支持一下博主哦
基于XML的缺点和解决方案
在 Spring 中虽然我们可以使用 XML 配置文件可以实现 AOP 开发但如果所有的配置都集中在 XML 配置文件中就势必会造成 XML 配置文件过于臃肿从而给维护和升级带来一定困难。 (这个XML配置就是逊呐)
AspectJ 框架为 AOP 开发提供了一套 AspectJ 注解。它允许我们直接在 Java 类中通过注解的方式对切面Aspect、切入点Pointcut和增强Advice进行定义Spring 框架可以根据这些注解生成 AOP 代理。
注解介绍
名称说明Aspect用于定义一个切面。Pointcut用于定义一个切入点。Before用于定义前置通知相当于 BeforeAdvice。AfterReturning用于定义后置通知相当于 AfterReturningAdvice。Around用于定义环绕通知相当于 MethodInterceptor。AfterThrowing用于定义抛出通知相当于 ThrowAdvice。After用于定义最终通知不管是否异常该通知都会执行。DeclareParents用于定义引介通知相当于 IntroductionInterceptor不要求掌握。
切入点表达式
学习使用Aspect进行AOP开发之前,要先了解一下切入点表达式。 AspectJ最强大的地方就在于他的切入点表达式
execution() 用于描述方法 语法格式为 execution([权限修饰符] [返回值类型] [类的完全限定名] [方法名称]([参数列表]) 其中:
返回值类型、方法名、参数列表是必须配置的选项权限修饰符、类的完全限定名则为可选配选项。返回值类型: *表示任意返回值 如果返回值为对象则需指定全路径的类名。类的完全限定名包名类名方法名: * 代表所有方法 set*代表以set开头的所有方法 *do 代表以do结尾的所有有方法 addUser 代表固定方法参数列表: (…)代表所有参数(*) 代表只有一个参数,且参数类型为任意类型 ( *,String) 代表有两个参数第一个参数可以为任何值第二个为 String 类型的值。
举例1:对org.example包下的UserDao类中的add()方法进行增强,配置如下
execution(* org.example.UserDao.add(..))举例2: 对org.example 包下 UserDao 类中的所有方法进行增强
execution(* org.example.UserDao.*(..))举例 3对 org.example 包下所有类中的所有方法进行增强
execution(* org.example.*.*(..))实现步骤
1.启用AspectJ注解支持
在使用 AspectJ 注解进行 AOP 开发前首先我们要先启用 AspectJ 注解支持。我们可以通过以下 2 种方式来启用 AspectJ 注解。
1)使用Java配置类启用
我们可以在 Java 配置类标注了 Configuration 注解的类中使用 EnableAspectJAutoProxy 和 ComponentScan 注解启用 AspectJ 注解支持。
Configuration
ComponentScan(basePackages org.example) //注解扫描
EnableAspectJAutoProxy //开启 AspectJ 的自动代理
public class AppConfig {
}2)基于XML配置启用
在Spring的XML配置文件中,添加以下内容启用AspectJ注解支持。
!-- 开启注解扫描 --
context:component-scan base-packageorg.example/
!--开启AspectJ 自动代理--
aop:aspectj-autoproxy/2.定义切面Aspect
可以通过 Aspect 注解将一个 Bean 定义为切面。
在启用了 AspectJ 注解支持的情况下Spring 会自动将 IoC 容器ApplicationContext中的所有使用了 Aspect 注解的 Bean 识别为一个切面。
1)只需要在定义好的Bean对应的Java类使用一个Aspect注解 将这个 Bean 定义为一个切面
bean id myAspect class org.example.MyAspect...
/beanpackage org.example;
import org.aspectj.lang.annotation.*;
Aspect //定义为切面
public class MyAspect {
}2)全注解方式定义切面
package org.example;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
Component //Spring自动装配 将类的对象定义成 Bean
Aspect //将Bean定义为切面
public class MyAspect {
}
3.定义切点Pointcut
使用 Pointcut 注解用来定义一个切点。需要注意的是定义为切点的方法它的返回值类型必须为 void。
// 要求方法必须是private返回值类型为 void名称自定义没有参数
Pointcut(execution(*org.example..*.*(..)))
private void myPointCut() {
}Pointcut 注解中有一个 value 属性这个属性的值就是切入点表达式。
除了可以通过切入点表达式execution直接对切点进行定义外还可以通过切入点方法的名称来引用其他的切入点。在使用方法名引用其他切入点时还可以使用“”、“||”和“!”等表示“与”、“或”、“非”的含义。
/**
* 将 org.example.dao包下 UserDao 类中的 get() 方法定义为一个切点
*/
Pointcut(value execution(* org.example.dao.UserDao.get(..)))
public void pointCut1(){
}/**
* 将 org.example.dao包下 UserDao 类中的 delete() 方法定义为一个切点
*/
Pointcut(value execution(* org.example.dao.UserDao.delete(..)))
public void pointCut2(){
}/**
* 除了 org.example.dao包下 UserDao 类中 get() 方法和 delete() 方法外其他方法都定义为切点
*
* 表示 非
* 表示 与
* || 表示 或
*/
Pointcut(value !pointCut1() !pointCut2())
public void pointCut3(){
}4.定义通知(Advice)
AspectJ 为我们提供了以下 6 个注解来定义 6 种不同类型的通知Advice如下表。
注解说明Before用于定义前置通知相当于 BeforeAdvice。AfterReturning用于定义后置通知相当于 AfterReturningAdvice。Around用于定义环绕通知相当于 MethodInterceptor。AfterThrowing用于定义抛出通知相当于 ThrowAdvice。After用于定义最终通知不管是否异常该通知都会执行。DeclareParents用于定义引介通知相当于 IntroductionInterceptor不要求掌握。
以上这些通知注解中都有一个 value 属性这个 value 属性的取值就是这些通知Advice作用的切点PointCut它既可以是切入点表达式也可以是切入点的引用切入点对应的方法名称)。
Pointcut(value execution(* org.example.dao.UserDao.get(..)))
public void pointCut1(){
}Pointcut(value execution(* org.example.dao.UserDao.delete(..)))
public void pointCut2(){
}Pointcut(value !pointCut1() !pointCut2())
public void pointCut3(){
}//使用切入点引用
Before(MyAspect.pointCut3())
public void around() throws Throwable {System.out.println(环绕增强……);
}//使用切入点表达式
AfterReturning(value execution(* org.example.dao.UserDao.get(..)) ,returning returnValue)
public void afterReturning(Object returnValue){System.out.println(方法返回值为returnValue);
}代码示例 新建Maven项目,在pom.xml文件中导入maven依赖 //在父级dependencies定义spring版本
spring.version5.3.15/spring.versiondependencies!--日志--dependencygroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactIdversion1.2/version/dependency!-- java ee --dependencygroupIdjavax/groupIdartifactIdjavaee-api/artifactIdversion7.0/version/dependency!-- 单元测试 --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version/dependency!-- Spring --dependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-beans/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-tx/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-expression/artifactIdversion5.3.15/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion5.3.15/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aspects/artifactIdversion${spring.version}/version/dependency!--Aspectj--dependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.9.7/version/dependency/dependencies在org.example.dao包下,创建一个名为UserDao的接口 package org.example.dao;/*** 数据访问层 接口*/
public interface UserDao {public void add();public void delete();public Integer modfiy();public void get();
} 在org.example.dao.imp1包下,创建UserDao的实现类UserDaoImp1 package org.example.dao.imp1;import org.example.dao.UserDao;
import org.springframework.stereotype.Component;Component(userDao)
public class UserDaoImp1 implements UserDao {Overridepublic void add() {System.out.println(正在执行UserDao的add()方法);}Overridepublic void delete() {System.out.println(正在执行UserDao的delete()方法);}Overridepublic Integer modfiy() {System.out.println(正在执行UserDao的modfiy()方法);return 1;}Overridepublic void get() {System.out.println(正在执行UserDao的get()方法);}
} 在org.example.dao.config包下,新建名为AppConfig的配置类 package org.example.dao.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;Configuration
ComponentScan(basePackages org.example) //注解扫描
EnableAspectJAutoProxy //开启AspectJ自动代理
public class AppConfig {
} 在org.example包下,创建名为MyAspect的切面类 package org.example;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;Component //定义成Bean
Aspect //定义为切面
public class MyAspect {Before(execution(* org.example.dao.UserDao.add(..)))public void before(JoinPoint joinPoint) {System.out.println(前置增强... joinPoint);}After(execution(* org.example.dao.UserDao.get(..)))public void after(JoinPoint joinPoint){System.out.println(最终增强...joinPoint);}//将org.example.dao下的UserDao类的get()方法定义为一个切点Pointcut(value execution(* org.example.dao.UserDao.get(..)))public void pointCut1(){}//将org.example.dao下的UserDao类的delete(()方法定义为一个切点Pointcut(value execution(* org.example.dao.UserDao.delete(..)))public void pointCut2(){}//使用切入点引用Around(MyAspect.pointCut2())public void around(ProceedingJoinPoint point) throws Throwable{System.out.println(环绕增强前...);point.proceed();System.out.println(环绕增强后...);}//使用切入点表达式AfterReturning(value execution(* org.example.dao.UserDao.modfiy(..)),returning returnValue)public void afterReturning(Object returnValue){System.out.println(后置返回增强...返回值为:returnValue);}} MainApp类 package org.example;import org.example.dao.UserDao;
import org.example.dao.config.AppConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main( String[] args ){ApplicationContext contextnew AnnotationConfigApplicationContext(AppConfig.class);UserDao userDao(UserDao)context.getBean(userDao);userDao.add();userDao.delete();userDao.modfiy();userDao.get();}
} 运行结果 前置增强...execution(void org.example.dao.UserDao.add())
正在执行UserDao的add()方法
环绕增强前...
正在执行UserDao的delete()方法
环绕增强后...
正在执行UserDao的modfiy()方法
后置返回增强...返回值为:1
正在执行UserDao的get()方法
最终增强...execution(void org.example.dao.UserDao.get()) 文章转载自: http://www.morning.jxgyg.cn.gov.cn.jxgyg.cn http://www.morning.gjwkl.cn.gov.cn.gjwkl.cn http://www.morning.qphcq.cn.gov.cn.qphcq.cn http://www.morning.xkpjl.cn.gov.cn.xkpjl.cn http://www.morning.jmmzt.cn.gov.cn.jmmzt.cn http://www.morning.zstbc.cn.gov.cn.zstbc.cn http://www.morning.bybhj.cn.gov.cn.bybhj.cn http://www.morning.rbcw.cn.gov.cn.rbcw.cn http://www.morning.rhjsx.cn.gov.cn.rhjsx.cn http://www.morning.nrlsg.cn.gov.cn.nrlsg.cn http://www.morning.fxwkl.cn.gov.cn.fxwkl.cn http://www.morning.rrqbm.cn.gov.cn.rrqbm.cn http://www.morning.jmllh.cn.gov.cn.jmllh.cn http://www.morning.lmtbl.cn.gov.cn.lmtbl.cn http://www.morning.cfnht.cn.gov.cn.cfnht.cn http://www.morning.pdmml.cn.gov.cn.pdmml.cn http://www.morning.hpkr.cn.gov.cn.hpkr.cn http://www.morning.qpzjh.cn.gov.cn.qpzjh.cn http://www.morning.pdynk.cn.gov.cn.pdynk.cn http://www.morning.rjljb.cn.gov.cn.rjljb.cn http://www.morning.linzhigongmao.cn.gov.cn.linzhigongmao.cn http://www.morning.wtdyq.cn.gov.cn.wtdyq.cn http://www.morning.pbdnj.cn.gov.cn.pbdnj.cn http://www.morning.wklhn.cn.gov.cn.wklhn.cn http://www.morning.nlqgb.cn.gov.cn.nlqgb.cn http://www.morning.jgcxh.cn.gov.cn.jgcxh.cn http://www.morning.fppzc.cn.gov.cn.fppzc.cn http://www.morning.cmzgt.cn.gov.cn.cmzgt.cn http://www.morning.nqlnd.cn.gov.cn.nqlnd.cn http://www.morning.wjzzh.cn.gov.cn.wjzzh.cn http://www.morning.wjjxr.cn.gov.cn.wjjxr.cn http://www.morning.bmmyx.cn.gov.cn.bmmyx.cn http://www.morning.rbmnq.cn.gov.cn.rbmnq.cn http://www.morning.gcqdp.cn.gov.cn.gcqdp.cn http://www.morning.wjqbr.cn.gov.cn.wjqbr.cn http://www.morning.mpsnb.cn.gov.cn.mpsnb.cn http://www.morning.dppfh.cn.gov.cn.dppfh.cn http://www.morning.ynryz.cn.gov.cn.ynryz.cn http://www.morning.yhglt.cn.gov.cn.yhglt.cn http://www.morning.zrhhb.cn.gov.cn.zrhhb.cn http://www.morning.hmnhp.cn.gov.cn.hmnhp.cn http://www.morning.nzxdz.cn.gov.cn.nzxdz.cn http://www.morning.yhyqg.cn.gov.cn.yhyqg.cn http://www.morning.mnpdy.cn.gov.cn.mnpdy.cn http://www.morning.lgtzd.cn.gov.cn.lgtzd.cn http://www.morning.yqqxj26.cn.gov.cn.yqqxj26.cn http://www.morning.rshijie.com.gov.cn.rshijie.com http://www.morning.wrbnh.cn.gov.cn.wrbnh.cn http://www.morning.lgtzd.cn.gov.cn.lgtzd.cn http://www.morning.kbgzj.cn.gov.cn.kbgzj.cn http://www.morning.wbfly.cn.gov.cn.wbfly.cn http://www.morning.xdqrz.cn.gov.cn.xdqrz.cn http://www.morning.lkrmp.cn.gov.cn.lkrmp.cn http://www.morning.wkcl.cn.gov.cn.wkcl.cn http://www.morning.qmncj.cn.gov.cn.qmncj.cn http://www.morning.sxygc.cn.gov.cn.sxygc.cn http://www.morning.zdbfl.cn.gov.cn.zdbfl.cn http://www.morning.xclgf.cn.gov.cn.xclgf.cn http://www.morning.rgksz.cn.gov.cn.rgksz.cn http://www.morning.jrlgz.cn.gov.cn.jrlgz.cn http://www.morning.xhgxd.cn.gov.cn.xhgxd.cn http://www.morning.phtqr.cn.gov.cn.phtqr.cn http://www.morning.mbqyl.cn.gov.cn.mbqyl.cn http://www.morning.pbksb.cn.gov.cn.pbksb.cn http://www.morning.rfqk.cn.gov.cn.rfqk.cn http://www.morning.mmxt.cn.gov.cn.mmxt.cn http://www.morning.pqypt.cn.gov.cn.pqypt.cn http://www.morning.wdwfm.cn.gov.cn.wdwfm.cn http://www.morning.nnmnz.cn.gov.cn.nnmnz.cn http://www.morning.sdhmn.cn.gov.cn.sdhmn.cn http://www.morning.qcnk.cn.gov.cn.qcnk.cn http://www.morning.dbnpz.cn.gov.cn.dbnpz.cn http://www.morning.ktblf.cn.gov.cn.ktblf.cn http://www.morning.fwqgy.cn.gov.cn.fwqgy.cn http://www.morning.fqyqm.cn.gov.cn.fqyqm.cn http://www.morning.lynkz.cn.gov.cn.lynkz.cn http://www.morning.xylxm.cn.gov.cn.xylxm.cn http://www.morning.tqgmd.cn.gov.cn.tqgmd.cn http://www.morning.yltnl.cn.gov.cn.yltnl.cn http://www.morning.fplwz.cn.gov.cn.fplwz.cn