基于XML及注解配置方式实现AOP及aspectJ表达式
aspectJ表達式結構
切入點表達式 execution (* com.sample.service.impl...(..))
1、execution(): 表達式主體。
2、第一個號:表示返回類型,號表示所有的類型。
3、包名:表示需要攔截的包名,后面的兩個句點表示當前包和當前包的所有子包,com.sample.service.impl包、子孫包下所有類的方法。
4、第二個號:表示類名,號表示所有的類。
5、(..):最后這個星號表示方法名,號表示所有的方法,后面括弧里面表示方法的參數,兩個句點表示任何參數。
通知
@Before:前置通知:在某連接點之前執行的通知,但這個通知不能阻止連接點之前的執行流程(除非它拋出一個異常)。
@AfterReturning :后置通知:在某連接點正常完成后執行的通知,通常在一個匹配的方法返回的時候執行。
@Around:環繞通知:包圍一個連接點的通知,如方法調用。這是最強大的一種通知類型。環繞通知可以在方法調用前后完成自定義的行為。它也會選擇是否繼續執行連接點或直接返回它自己的返回值或拋出異常來結束執行。
@AfterThrowing:異常通知:在方法拋出異常退出時執行的通知。
@After 最終通知:當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。
-------------------------------------------------------------------------------------------------------------------------
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion> ?<groupId>com.henu</groupId><artifactId>spring02_USEAOP</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- spring4.3.20 --><!-- spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.20.RELEASE</version></dependency><!-- spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.3.20.RELEASE</version></dependency><!-- spring-beans --><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.3.20.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-expression --><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.3.20.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>4.3.20.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4.3.20.RELEASE</version></dependency><!--使用AspectJ方式注解需要相應的包 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.1</version></dependency> ?<!--使用AspectJ方式注解需要相應的包 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.2</version></dependency> ?</dependencies> ? </project>UserDao
package com.henu.dao; ? import java.util.Date; import java.util.List; ? public interface UserDao {void insert();void delete();void update();void qianzhi();List<Date> select();void find(int id); } ?UserDaoImpl
package com.henu.dao;/*** Created by Administrator on 2019/9/16 0016.*/ ? import java.util.Date; import java.util.List; ? public class UserDaoImpl implements UserDao { ?public void insert() {System.out.println("dao:insert()");} ?public void delete() {System.out.println("dao:delete()");} ?public void update() {System.out.println("dao:update()");} ?public void qianzhi() {System.out.println("dao.qianzhi()");}public List<Date> select() {System.out.println("dao:select()");return null;} ?public void find(int id) {System.out.println("dao:find()");} ? } ?UserService
package com.henu.service; ? import java.util.Date; import java.util.List; ? /*** 業務層接口*/ public interface UserService {void insert();void delete();void update();void qianzhi(String name,int age,Date date);List<Date> select();void find(int id); } ?UserServiceImpl
package com.henu.service; ? import com.henu.dao.UserDao; ? import java.util.ArrayList; import java.util.Date; import java.util.List; ? public class UserServiceImpl implements UserService{//注入dao層對象public UserDao userDao; ?public void insert() {System.out.println("service:insert()");//調用dao層userDao.insert();} ?public void delete() {System.out.println("service:delete()");//調用dao層userDao.delete();} ?public void update() {System.out.println("service:update()");System.out.println(10/0);//調用dao層userDao.update();} ?public void qianzhi(String name, int age, Date date) {System.out.println("service.qianzhi()"+name + age+ date.toString());userDao.qianzhi();} ? ?public List<Date> select() {System.out.println("service:select()");//調用dao層userDao.select();List<Date> list = new ArrayList<Date>();list.add(new Date());list.add(new Date());list.add(new Date());return list;} ?public void find(int id) {System.out.println("service:find()" + id);userDao.find(56345);} ?public UserDao getUserDao() {return userDao;} ?public void setUserDao(UserDao userDao) {this.userDao = userDao;} } ?UserController
package com.henu.controller; ? import com.henu.service.UserService; ? import java.util.Date; ? /*** 控制器*/ public class UserController {//注入業務層對象public UserService userService;public void execute(){System.out.println("controller:execute()");userService.insert();} ?public void delete(){System.out.println("controller:delete()");userService.delete();} ?public void update(){System.out.println("controller:update()");userService.update();} ?public void qianzhi(){System.out.println("controller:qianzhi()");userService.qianzhi("喬治大哥",22,new Date());} ?public void select(){System.out.println("controller:select()");userService.select();} ?public void find(){System.out.println("controller:find()");userService.find(56345);} ?public UserService getUserService() {return userService;} ?public void setUserService(UserService userService) {this.userService = userService;} } ?UserAspect
package com.henu.aspect; ? import org.aspectj.lang.ProceedingJoinPoint; ? import java.util.Date; import java.util.List; ? ? /*** 切面類*/ public class UserAspect {//切面類 ?public void validate() {//橫切關注點System.out.println("權限驗證......");} ?public void log() {//橫切關注點System.out.println("記錄日志......");} ?public Object aroundMethod(ProceedingJoinPoint pjp) throws Throwable {System.out.println("努力");Object obj = pjp.proceed();//相當于過濾。//有興趣可以是一下Object obj = null;看看輸出結果System.out.println("陪她優雅的老去");return obj;} ?public void exceptionMethod(){System.out.println("出錯了!");} ?public void FinallyMethod(){System.out.println("保持加油》》》");} ?public void qianzhiMethod(String name,int age,Date date){System.out.println("前置檢查......"+name+" "+age+" "+date);} ?public void selectMethod(List<Date> list){System.out.println("每分每秒:" + list);} ?public Object aroundMethod2(ProceedingJoinPoint pjp,int id) throws Throwable {System.out.println("首先:"+id);Object obj2 = pjp.proceed();System.out.println("最后"+id);return obj2;} }applicationContext.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: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"><!--***配置AOP***--><!--切面類--><bean id="userAspect" class="com.henu.aspect.UserAspect"/><aop:config><!--切面--><aop:aspect id="aopAspect" ref="userAspect"><!--切入點--><aop:pointcut id="insertPointCut" expression="execution(* com.henu.service.UserServiceImpl.insert(..))"/><aop:pointcut id="deletePointCut" expression="execution(* com.henu.service.UserServiceImpl.delete(..))"/><aop:pointcut id="updatePointCut" expression="execution(* com.henu.service.UserServiceImpl.update(..))"/><aop:pointcut id="qianzhiPointCut" expression="execution(* com.henu.service.UserServiceImpl.qianzhi(..)) and args(name,age,date)"/><aop:pointcut id="selectPointCut" expression="execution(* com.henu.service.UserServiceImpl.select(..))"/><aop:pointcut id="findPointCut" expression="execution(* com.henu.service.UserServiceImpl.find(..)) and args(id)"/><!--前置通知--><aop:before pointcut-ref="insertPointCut" method="validate"></aop:before><!--后置通知--><aop:after-returning pointcut-ref="insertPointCut" method="log"/><!--環繞通知--><aop:around method="aroundMethod" pointcut-ref="deletePointCut"></aop:around><!--異常攔截通知--><aop:after-throwing method="exceptionMethod" pointcut-ref="updatePointCut"></aop:after-throwing><!--最終通知--><aop:after-throwing method="FinallyMethod" pointcut-ref="updatePointCut"></aop:after-throwing><!--在前置通知中獲取方法返回值--><aop:before method="qianzhiMethod" pointcut-ref="qianzhiPointCut"></aop:before><!--在后置通知中獲取方法返回值--><aop:after-returning method="selectMethod" pointcut-ref="selectPointCut" returning="list"></aop:after-returning><!--在環繞通知中獲取方法參數及返回值--><aop:around method="aroundMethod2" pointcut-ref="findPointCut"></aop:around></aop:aspect></aop:config><!--dao--><bean id="uerDaoImpl" class="com.henu.dao.UserDaoImpl"></bean><!--service--><bean id="userServiceImpl" class="com.henu.service.UserServiceImpl"><!--把dao注入到service--><property name="userDao" ref="uerDaoImpl"></property></bean><!--controler--><bean id="userController" class="com.henu.controller.UserController"><property name="userService" ref="userServiceImpl"></property></bean> </beans>App
package com.henu; ? import com.henu.controller.UserController; import org.springframework.context.support.ClassPathXmlApplicationContext; ? /*** Hello world!**/ public class App { ?public static void main(String[] args ) {//加載spring IoC配置文件//ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");//獲取控制器對象UserController bean = context.getBean(UserController.class);//ctrl + alt + v//調用控制器方法 // ? ? ? bean.execute(); // ? ? ? bean.delete(); // ? ? ? bean.update();bean.qianzhi(); // ? ? ? bean.select(); // ? ? ? bean.find();//關閉ioc容器context.close(); ?} } ?運行結果:
自行檢驗吧。-------------------------------------------------------------------------------------------------------------------------------------
對于注釋的方式:首先是每個類的注釋
?
?
?
?
?
最主要的一點applicationContext.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:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!--classPath掃描--><context:component-scan base-package="com.henu"></context:component-scan><!--AspectJ--><aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>?
總結
以上是生活随笔為你收集整理的基于XML及注解配置方式实现AOP及aspectJ表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring整合jdbc
- 下一篇: spring——使用xml声明式事务整合