java框架篇---spring aop两种配置方式

简介:




java框架篇---spring aop两种配置方式


第一种:注解配置AOP

注解配置AOP(使用 AspectJ 类库实现的),大致分为三步:
1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before, @AfterReturning,@After,@AfterThrowing,@Around).
2. 开发需要被拦截的类。
3. 将切面配置到xml中,当然,我们也可以使用自动扫描Bean的方式。这样的话,那就交由Spring AoP容器管理。

另外需要引用 aspectJ 的 jar 包: aspectjweaver.jar aspectjrt.jar

实例:

User.java


 
 
  1. package com.bjsxt.model; 
  2.  
  3. public class User { 
  4.     private String username; 
  5.     private String password; 
  6.     public String getUsername() { 
  7.         return username; 
  8.     } 
  9.     public void setUsername(String username) { 
  10.         this.username = username; 
  11.     } 
  12.     public String getPassword() { 
  13.         return password; 
  14.     } 
  15.     public void setPassword(String password) { 
  16.         this.password = password; 
  17.     } 
  18. }

 
 
  1. /** 
  2. *接口类 
  3. */ 
  4. package com.bjsxt.dao; 
  5. import com.bjsxt.model.User; 
  6.  
  7.  
  8. public interface UserDAO { 
  9.     public void save(User user); 

实现接口:


 
 
  1. package com.bjsxt.dao.impl; 
  2.  
  3. import org.springframework.stereotype.Component; 
  4.  
  5. import com.bjsxt.dao.UserDAO; 
  6. import com.bjsxt.model.User; 
  7.  
  8. @Component("u") 
  9. public class UserDAOImpl implements UserDAO { 
  10.  
  11.     public void save(User user) { 
  12.          
  13.         System.out.println("user save11d!"); 
  14.         /*throw new RuntimeException("exception");*/ //抛异常 
  15.     } 
  16.  

操作类:


 
 
  1. package com.bjsxt.service; 
  2. import javax.annotation.Resource; 
  3.  
  4. import org.springframework.beans.factory.annotation.Autowired; 
  5. import org.springframework.beans.factory.annotation.Qualifier; 
  6. import org.springframework.stereotype.Component; 
  7.  
  8. import com.bjsxt.dao.UserDAO; 
  9. import com.bjsxt.model.User; 
  10.  
  11.  
  12. @Component("userService") 
  13. public class UserService { 
  14.      
  15.     private UserDAO userDAO;   
  16.      
  17.     public void init() { 
  18.         System.out.println("init"); 
  19.     } 
  20.      
  21.     public void add(User user) { 
  22.         userDAO.save(user); 
  23.     } 
  24.     public UserDAO getUserDAO() { 
  25.         return userDAO; 
  26.     } 
  27.      
  28.     @Resource(name="u") 
  29.     public void setUserDAO( UserDAO userDAO) { 
  30.         this.userDAO = userDAO; 
  31.     } 
  32.     
  33.     public void destroy() { 
  34.         System.out.println("destroy"); 
  35.     } 

加入aop


 
 
  1. package com.bjsxt.aop; 
  2.  
  3. import org.aspectj.lang.annotation.After; 
  4. import org.aspectj.lang.annotation.AfterReturning; 
  5. import org.aspectj.lang.annotation.AfterThrowing; 
  6. import org.aspectj.lang.annotation.Aspect; 
  7. import org.aspectj.lang.annotation.Before; 
  8. import org.aspectj.lang.annotation.Pointcut; 
  9. import org.springframework.stereotype.Component; 
  10.  
  11. @Aspect 
  12. @Component 
  13. public class LogInterceptor { 
  14.     @Pointcut("execution(public * com.bjsxt.service..*.add(..))") 
  15.     public void myMethod(){}; 
  16.      
  17.     /*@Before("execution(public void com.bjsxt.dao.impl.UserDAOImpl.save(com.bjsxt.model.User))")*/ 
  18.     @Before("myMethod()") 
  19.     public void before() { 
  20.         System.out.println("method staet"); 
  21.     }  
  22.     @After("myMethod()") 
  23.     public void after() { 
  24.         System.out.println("method after"); 
  25.     }  
  26.     @AfterReturning("execution(public * com.bjsxt.dao..*.*(..))") 
  27.     public void AfterReturning() { 
  28.         System.out.println("method AfterReturning"); 
  29.     }  
  30.     @AfterThrowing("execution(public * com.bjsxt.dao..*.*(..))") 
  31.     public void AfterThrowing() { 
  32.         System.out.println("method AfterThrowing"); 
  33.     }  

配置文件


 
 
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans xmlns="http://www.springframework.org/schema/beans" 
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.        xmlns:context="http://www.springframework.org/schema/context" 
  5.        xmlns:aop="http://www.springframework.org/schema/aop" 
  6.        xsi:schemaLocation="http://www.springframework.org/schema/beans 
  7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
  8.            http://www.springframework.org/schema/context 
  9.            http://www.springframework.org/schema/context/spring-context-2.5.xsd 
  10.            http://www.springframework.org/schema/aop             
  11.            http://www.springframework.org/schema/aop/spring-aop-3.1.xsd   
  12.            "><!-- 要添加最后2行 --> 
  13.             
  14.     <context:annotation-config /> 
  15.     <context:component-scan base-package="com.bjsxt"/>  <!-- 自动扫描 --> 
  16.     <aop:aspectj-autoproxy/>  <!-- 要添加本行 --> 
  17. </beans> 

测试类:


 
 
  1. package com.bjsxt.service; 
  2. import org.junit.Test; 
  3. import org.springframework.context.ApplicationContext; 
  4. import org.springframework.context.support.ClassPathXmlApplicationContext; 
  5.  
  6. import com.bjsxt.model.User; 
  7.  
  8. //Dependency Injection 
  9. //Inverse of Control 
  10. public class UserServiceTest { 
  11.  
  12.     @Test 
  13.     public void testAdd() throws Exception { 
  14.         ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
  15.          
  16.          
  17.         UserService service = (UserService)ctx.getBean("userService"); 
  18.         System.out.println(service.getClass()); 
  19.         service.add(new User()); 
  20.         System.out.println("###"); 
  21.          
  22.         ctx.destroy(); 
  23.          
  24.     } 
  25.  

结果:

class com.bjsxt.service.UserService$$EnhancerByCGLIB$$7b201784
method staet
user save11d!
method AfterReturning
method after
###

注意:

@Aspect:意思是这个类为切面类
@Componet:因为作为切面类需要 Spring 管理起来,所以在初始化时就需要将这个类初始化加入 Spring 的管理;
@Befoe:切入点的逻辑(Advice)
execution…:切入点语法

第二种:xml配置aop

实例同上:只是配置文件不同


 
 
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans xmlns="http://www.springframework.org/schema/beans" 
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.        xmlns:context="http://www.springframework.org/schema/context" 
  5.        xmlns:aop="http://www.springframework.org/schema/aop" 
  6.        xsi:schemaLocation="http://www.springframework.org/schema/beans 
  7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
  8.            http://www.springframework.org/schema/context 
  9.            http://www.springframework.org/schema/context/spring-context-2.5.xsd 
  10.            http://www.springframework.org/schema/aop             
  11.            http://www.springframework.org/schema/aop/spring-aop-3.1.xsd   
  12.            "><!-- 要添加最后2行 --> 
  13.             
  14.     <context:annotation-config /> 
  15.     <context:component-scan base-package="com.bjsxt"/> 
  16.     <bean id="logInterceptor" class="com.bjsxt.aop.LogInterceptor"></bean> 
  17.     <aop:config> 
  18.         <aop:pointcut expression="execution(public * com.bjsxt.service..*.add(..))"  
  19.         id="servicePointcut"/> 
  20.         <aop:aspect id="logAspect" ref="logInterceptor"> 
  21.             <aop:before method="before"  pointcut-ref="servicePointcut" /> 
  22.         </aop:aspect> 
  23.          
  24.     </aop:config> 
  25. </beans> 

下面的<beans>是Spring的配置标签,beans里面几个重要的属性:

xmlns:

是默认的xml文档解析格式,即spring的beans。地址是http://www.springframework.org/schema/beans。

通过设置这个属性,所有在beans里面声明的属性,可以直接通过<>来使用,比如<bean>等等。

xmlns:xsi:

是xml需要遵守的规范,通过URL可以看到,是w3的统一规范,后面通过xsi:schemaLocation来定位所有的解析文件。

xmlns:aop:

这个是重点,是我们这里需要使用到的一些语义规范,与面向切面AOP相关。

xmlns:tx:

Spring中与事务相关的配置内容。

一个XML文件,只能声明一个默认的语义解析的规范。

例如上面的xml中就只有beans一个是默认的,其他的都需要通过特定的标签来使用,比如aop,它自己有很多的属性,如果要使用,前面就必须加上aop:xxx才可以。比如上面的aop:config。

类似的,如果默认的xmlns配置的是aop相关的语义解析规范,那么在xml中就可以直接写config这种标签了。


作者:返回主页 偶my耶

来源:51CTO

相关文章
|
1天前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
11 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
13天前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
101 29
|
12天前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
58 21
|
2天前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
21 7
|
2天前
|
XML Java 开发者
通过springboot框架创建对象(一)
在Spring Boot中,对象创建依赖于Spring框架的核心特性——控制反转(IoC)和依赖注入(DI)。IoC将对象的创建和管理交由Spring应用上下文负责,开发者只需定义依赖关系。DI通过构造函数、setter方法或字段注入实现依赖对象的传递。Spring Boot的自动配置机制基于类路径和配置文件,自动为应用程序配置Spring容器,简化开发过程。Bean的生命周期包括定义扫描、实例化、依赖注入、初始化和销毁回调,均由Spring容器管理。这些特性提高了开发效率并简化了代码维护。
|
28天前
|
并行计算 算法 Java
Java中的Fork/Join框架详解
Fork/Join框架是Java并行计算的强大工具,尤其适用于需要将任务分解为子任务的场景。通过正确使用Fork/Join框架,可以显著提升应用程序的性能和响应速度。在实际应用中,应结合具体需求选择合适的任务拆分策略,以最大化并行计算的效率。
47 23
|
24天前
|
Java Linux iOS开发
如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH
本文详细介绍如何在Windows和Linux/macOS系统上配置Java环境变量。
677 12
|
28天前
|
Java
CentOS7.8配置Adoptium-Java17运行环境
本指南介绍如何设置清华镜像源并安装 Temurin-17-JRE 运行环境。首先,编辑 `/etc/yum.repos.d/adoptium.repo` 文件,配置清华镜像源。接着,使用 `yum install -y temurin-17-jre` 命令安装 Temurin-17-JRE,并通过 `java --version` 验证安装成功。相关配置和操作界面截图附后。
43 8
|
24天前
|
前端开发 NoSQL Java
【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
本文介绍了如何配置和启动基于Java的若依(RuoYi)项目,涵盖后端和前端的详细步骤。首先,准备Redis、MySQL以及IDE(如Idea和VS)。接着,通过GitHub获取代码并导入到IDE中,执行必要的SQL文件和配置数据库密码。然后,启动Redis并进行相关配置。最后,按照前端配置步骤克隆前端代码库,打开终端执行命令完成前端配置。整个过程详细记录了每一步的操作,帮助开发者顺利部署若依项目。 如果你觉得有帮助,请点赞、关注和收藏,这将是我持续分享的动力!
245 1
|
28天前
|
开发框架 运维 监控
Spring Boot中的日志框架选择
在Spring Boot开发中,日志管理至关重要。常见的日志框架有Logback、Log4j2、Java Util Logging和Slf4j。选择合适的日志框架需考虑性能、灵活性、社区支持及集成配置。本文以Logback为例,演示了如何记录不同级别的日志消息,并强调合理配置日志框架对提升系统可靠性和开发效率的重要性。