`
Supanccy2013
  • 浏览: 220707 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spring Aop之 注解实现

阅读更多
1,在Spring配置文件中开启注解aop的基本开关。注意使用注解时一定要在spring配置文件中打开相关配置,否则aop是不起作用的。相关重要的配置都已经在配置文件中说明了。
<?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"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:jee="http://www.springframework.org/schema/jee"
 xmlns:lang="http://www.springframework.org/schema/lang"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:util="http://www.springframework.org/schema/util"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://www.springframework.org/schema/aop
  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-3.0.xsd
  http://www.springframework.org/schema/jee
  http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
  http://www.springframework.org/schema/lang
  http://www.springframework.org/schema/lang/spring-lang-3.0.xsd
  http://www.springframework.org/schema/tx
  http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
  http://www.springframework.org/schema/util
  http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<!-- 为了启用spring对@AspectJ切面配置的支持,并保证Spring容器中
的目标Bean被一个或多个 切面自动增强,必须在Spring配置文件中配置如下片段-->
<!-- 启动@AspectJ支持 -->
<aop:aspectj-autoproxy/>
<!-- 下面的bean用来自动生成目标bean的增强代理bean -->
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"></bean>
<!-- 设置被增强的bean(也就是目标bean),及aspect切面bean所在的包名字 -->
<context:component-scan base-package="com.supan.serviceimp,com.supan.aspect" >
       <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/>
</context:component-scan>

<bean id="personAction" class="com.supan.action.PersonAction">
               <property name="ps" ref="personService"></property>
</bean>
<bean id="personService" class="com.supan.serviceimp.PersonServiceImp"></bean>
</beans>


2,strutx.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />
    <package name="default" namespace="/" extends="json-default">
       <action name="addPerson" class="personAction" method="addPerson">
            <result name="success">/person/personResult.jsp</result>
       </action>
    </package>
</struts>


3,web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>
  <filter>
      <filter-name>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  <listener>
       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>



4,Aspect切面Bean
package com.supan.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
//使用@Aspect定义一个切面类
@Aspect
public class LogAspect {
	//在目标方法调用之前写系统日志
	/*
	 * 使用before增强处理只能在目标方法执行之前植入增强,使用before
	 * 增强处理无须理会目标方法的执行,所以before处理无法阻止目标
	 * 方法的执行,before增强处理执行时,目标方法还未获得执行的机会。
	 * 所以before增强处理无法访问目标方法的返回值。
	 */
	@Before(value="execution(* com.supan.serviceimp.*.add*(..))")
	public void writeLog(){
		System.out.println("在目标函数调用之前写系统日志");
	}
	/*
	 * AfterReturning增强处理在目标方法正常完成后被植入
	 * 含有两个属性pointcut/value  returning
	 * 使用returning属性还有一个额外的作用:它可用于限定切入点只匹配具有
	 * 对应返回值类型的方法--假如在上面的log()方法中定义rvt的形参类型是String
	 * 则该切入点只匹配包下的返回值类型为String的所有方法。
	 */
	@AfterReturning(pointcut="execution(* com.supan.serviceimp.*.delete*(..))",returning="rvt")
	public void afterReturning(Object rvt){
		System.out.println("afterReturnning增强:目标函数的返回值是:" + rvt);
	}
	/*
	 * AfterReturning增强处理只有在目标方法成功完成后才被植入
	 * After增强处理不管目标方法如何介乎(包括正常结束也包括异常结束)它都会被植入
	 */
	@After(value="execution(* com.supan.serviceimp.*.select*(..))")
	public void after(){
		System.out.println("selectPerson方法已经查询完毕了,不管该方法是不是正常结束");
	}
	/*
	 * Around增强处理是功能比较强大的增强处理,
	 * Around = Before + AfterReturning
	 */
	@Around(value="execution(* com.supan.serviceimp.*.around*(..))")
	public void around(ProceedingJoinPoint jp) throws Throwable{
		System.out.println("目标方法还没有执行,开启事务");
		jp.proceed();
		System.out.println("目标方法已经执行,关闭事务");
	}
}


5,Action
package com.supan.action;
import com.opensymphony.xwork2.ActionSupport;
import com.supan.service.PersonService;
public class PersonAction extends ActionSupport {
	private PersonService ps;
	private String name;
	private int age;
	private String address;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
	public PersonService getPs() {
		return ps;
	}
	public void setPs(PersonService ps) {
		this.ps = ps;
	}
	public String addPerson(){
		ps.addPerson();
		
		System.out.println("----------------------");
		ps.deletePerson();
		System.out.println("**********************");
		ps.selectPerson();
		ps.aroundTest();
		return null;
	}
}


5,service
package com.supan.service;
public interface PersonService {
	public void addPerson();
	public int deletePerson();
	public void selectPerson();
	public void aroundTest();
}
package com.supan.serviceimp;
import org.springframework.stereotype.Component;

import com.supan.service.PersonService;
@Component
public class PersonServiceImp implements PersonService {
	public void addPerson() {
		System.out.println("开始添加人员");
		System.out.println("添加人员结束");
	}
	public int deletePerson() {
		return 0;
	}
	public void selectPerson(){
		System.out.println("人物已经查询完毕");
	}
	public void aroundTest() {
       System.out.println("执行around方法结束");		
	}
}


6,jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
     <s:form action="addPerson">
         <s:textfield label="姓名" name="name"></s:textfield>
         <s:textfield label="年龄" name="age"></s:textfield>
         <s:textfield label="地址" name="address"></s:textfield>
         <s:submit name="添加"></s:submit>
     </s:form>
  </body>
</html>


7,系统后台输出
在目标函数调用之前写系统日志
开始添加人员
添加人员结束
----------------------
afterReturnning增强:目标函数的返回值是:0
**********************
人物已经查询完毕
selectPerson方法已经查询完毕了,不管该方法是不是正常结束
目标方法还没有执行,开启事务
执行around方法结束
目标方法已经执行,关闭事务
分享到:
评论

相关推荐

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、可在现有源码上快速进行功能扩展 4、spring boot,mybatis,druid,spring aop的使用

    使用Spring的注解方式实现AOP的细节

    本篇文章将深入探讨如何通过Spring的注解方式实现AOP的细节。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或责任。切点(Pointcut)定义了哪些方法会被通知(Advice...

    Spring Aop的简单实现

    在本项目中,我们将探讨如何通过配置文件实现Spring AOP,包括前置通知、后置通知以及拦截器的运用。 首先,我们需要理解Spring AOP的核心概念。切面(Aspect)是关注点的模块化,这些关注点定义了跨越多个对象的...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    在Spring AOP中,我们通常使用@Aspect注解来定义切面类。切面类中可以包含多个通知(Advice),包括前置通知(Before)、后置通知(After)、返回通知(After-returning)、异常通知(After-throwing)和环绕通知...

    Spring AOP的简单实现

    在这个场景中,我们将使用Spring AOP来实现一个日志记录的功能,以追踪系统中各个方法的调用情况,包括访问时间以及传递的参数。下面将详细阐述如何实现这一目标。 首先,我们需要了解AOP的基本概念。AOP的核心是切...

    Spring AOP实现机制

    Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的可复用性和可维护性。 ### 1. ...

    spring aop jar 包

    这个"spring aop jar 包"包含了实现这一功能所需的类和接口,使得开发者能够轻松地实现面向切面的编程。 在Spring AOP中,主要涉及以下几个核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,比如日志记录...

    spring aop注解版

    总结起来,Spring AOP注解版通过简单易懂的注解,使得面向切面编程变得更加直观和方便。它降低了横切关注点与业务逻辑之间的耦合度,提高了代码的可维护性和复用性。通过合理利用这些注解,开发者可以轻松地实现日志...

    spring AOP注解的应用1

    在Spring框架中,AOP(面向切面编程)是一...Spring AOP注解的应用使得切面编程更加简单直观,大大简化了对横切关注点的管理。在实际开发中,结合Spring提供的其他特性,如事务管理,可以构建出高效、健壮的后端系统。

    springboot spring aop 拦截器注解方式实现脱敏

    总结一下,通过上述步骤,我们已经在Spring Boot应用中利用Spring AOP和注解方式实现了数据脱敏。这个拦截器可以在不修改原有业务代码的情况下,确保敏感信息在响应给客户端之前得到处理,提高了应用的安全性。同时...

    SpringAOP的注解配置

    在Spring AOP中,我们可以通过注解配置来实现切面编程,从而简化代码并提高可维护性。 首先,我们需要了解Spring AOP中的核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,它包含了横切关注点(如日志)和...

    Spring AOP 16道面试题及答案.docx

    Spring支持两种AOP的实现方式:Spring AspectJ注解风格和Spring XML配置风格。使用AspectJ注解风格是最常见的,它允许开发者直接在方法上使用注解来定义切面。 Spring AOP中有五种不同类型的的通知(Advice): 1....

    Spring AOP的底层实现技术

    下面我们将深入探讨Spring AOP的底层实现技术和相关知识点。 1. **代理模式** Spring AOP基于两种代理机制实现:JDK动态代理和CGLIB代理。JDK动态代理适用于实现了接口的目标对象,通过反射机制创建一个代理类来...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...

    SpringAop学习笔记以及实现Demo

    **Spring AOP 学习笔记及实现Demo** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的主要目的...

    springAop+自定义注解实现权限管理

    一个简单的采用自定义注解结合SpringAop实现方法执行的权限管理,这个demo中并没有涉及到与数据库的交互和业务代码,用户权限在登陆时采用简单的手动初始化。该demo用的jdk1.7编译,Spring4.0版本,只想通过这个demo...

    spring aop依赖jar包

    现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...

    Spring AOP完整例子

    Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过插入切面来增强或改变程序的行为。在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型...

    Spring AOP + 注解实现统一注解功能

    "Spring AOP + 注解实现统一注解功能" 本文我们通过Spring AOP和Java的自定义注解来实现日志的插入功能,该方案对原有业务入侵较低,实现较灵活。下面我们将详细介绍该功能的实现原理和相关知识点。 1. 概述 在...

Global site tag (gtag.js) - Google Analytics