- 浏览: 1048369 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1441)
- 软件思想&演讲 (9)
- 行业常识 (250)
- 时时疑问 (5)
- java/guava/python/php/ruby/R/scala/groovy (213)
- struct/spring/springmvc (37)
- mybatis/hibernate/JPA (10)
- mysql/oracle/sqlserver/db2/mongdb/redis/neo4j/GreenPlum/Teradata/hsqldb/Derby/sakila (268)
- js/jquery/jqueryUi/jqueryEaseyUI/extjs/angulrJs/react/es6/grunt/zepto/raphael (81)
- ZMQ/RabbitMQ/ActiveMQ/JMS/kafka (17)
- lucene/solr/nuth/elasticsearch/MG4J (167)
- html/css/ionic/nodejs/bootstrap (19)
- Linux/shell/centos (56)
- cvs/svn/git/sourceTree/gradle/ant/maven/mantis/docker/Kubernetes (26)
- sonatype nexus (1)
- tomcat/jetty/netty/jboss (9)
- 工具 (17)
- ETL/SPASS/MATLAB/RapidMiner/weka/kettle/DataX/Kylin (11)
- hadoop/spark/Hbase/Hive/pig/Zookeeper/HAWQ/cloudera/Impala/Oozie (190)
- ios/swift/android (9)
- 机器学习&算法&大数据 (18)
- Mesos是Apache下的开源分布式资源管理框架 (1)
- echarts/d3/highCharts/tableau (1)
- 行业技能图谱 (1)
- 大数据可视化 (2)
- tornado/ansible/twisted (2)
- Nagios/Cacti/Zabbix (0)
- eclipse/intellijIDEA/webstorm (5)
- cvs/svn/git/sourceTree/gradle/jira/bitbucket (4)
- jsp/jsf/flex/ZKoss (0)
- 测试技术 (2)
- splunk/flunm (2)
- 高并发/大数据量 (1)
- freemarker/vector/thymeleaf (1)
- docker/Kubernetes (2)
- dubbo/ESB/dubboX/wso2 (2)
最新评论
Spring对AOP的实现提供了很好的支持。下面我们就使用Spring的注解来完成AOP做一个例子。
首先,为了使用Spring的AOP注解功能,必须导入如下几个包。aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar.
1、实体bean
Java代码 收藏代码
public class Person {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、接口类
Java代码 收藏代码
public interface PersonService {
public void save(Person person);
public void update(Person person);
public Person getByIdPerson(Long id);
public void delete(Long id);
}
3、实现类
Java代码 收藏代码
public class PersonServiceImpl implements PersonService{
Map<Long, Person> maps = new HashMap<Long, Person>();
@Override
public void save(Person person) {
System.out.println("***执行save方法***");
maps.put(person.getId(), person);
}
@Override
public void update(Person person) {
System.out.println("***执行update()方法***");
maps.remove(person.getId());
maps.put(person.getId(), person);
}
@Override
public Person getByIdPerson(Long id) {
System.out.println("***执行getByIdPerson()方法***");
return maps.get(id);
}
@Override
public void delete(Long id) {
System.out.println("***执行delete()方法***");
maps.remove(id);
}
}
4、使用Spring注解方式对这个Bean进行方法拦截
Java代码 收藏代码
@Aspect
public class MyInterceptor {
@Pointcut("execution(* cn.tzz.aop.annotation.service.impl..*.*(..))")
private void anyMethod(){}//定义切点
@Before("anyMethod() && args(person)")
public void doAccessCheck(Person person){
System.out.println(person.getName());
System.out.println("前置通知");
}
@AfterReturning("anyMethod()")
public void doAfter(){
System.out.println("后置通知");
}
@After("anyMethod()")
public void after(){
System.out.println("最终通知");
}
@AfterThrowing("anyMethod()")
public void doAfterThrow(){
System.out.println("异常通知");
}
@Around("anyMethod()")
public Object doBasicProfiling(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
System.out.println("进入环绕通知");
Object object = proceedingJoinPoint.proceed();//执行该方法
System.out.println("退出方法");
return object;
}
}
Java代码 收藏代码
@Pointcut("execution(* cn.tzz.aop.annotation.service.impl..*.*(..))")
上述是定义方法切入点,execution为执行的意思,*代表任意返回值,然后是包名,.*意思是包下面的所有子包,(..)代表各种方法.
5、在Spring的配置文件中配置Bean,需要打开AOP命名空间
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:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="cn.tzz.aop.annotation" />
<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id="personService" class="cn.tzz.aop.annotation.service.impl.PersonServiceImpl"></bean>
<bean id="myInterceptor" class="cn.tzz.aop.annotation.MyInterceptor"></bean>
</beans>
6、测试
Java代码 收藏代码
public class TestAop {
private static ApplicationContext ctx = null;
private static PersonService personService = null;
static{
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
personService = (PersonService)ctx.getBean("personService");
}
public void testSave(){
Person person = new Person();
person.setId(1L);
person.setName("abc");
personService.save(person);
}
public void testGetByIdPerson(){
Person p = personService.getByIdPerson(1L);
System.out.println(p.getId()+"---"+p.getName());
}
public void testUpdate(){
Person person = new Person();
person.setId(1L);
person.setName("abc_1");
personService.update(person);
}
public void testDelete(){
personService.delete(1L);
}
@Test
public void testInteceptor(){
testSave();
// testGetByIdPerson();
// testUpdate();
// testGetByIdPerson();
// testDelete();
// testGetByIdPerson();
}
}
7、测试结果
Java代码 收藏代码
abc
前置通知
进入环绕通知
***执行save方法***
后置通知
退出方法
最终通知
首先,为了使用Spring的AOP注解功能,必须导入如下几个包。aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar.
1、实体bean
Java代码 收藏代码
public class Person {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、接口类
Java代码 收藏代码
public interface PersonService {
public void save(Person person);
public void update(Person person);
public Person getByIdPerson(Long id);
public void delete(Long id);
}
3、实现类
Java代码 收藏代码
public class PersonServiceImpl implements PersonService{
Map<Long, Person> maps = new HashMap<Long, Person>();
@Override
public void save(Person person) {
System.out.println("***执行save方法***");
maps.put(person.getId(), person);
}
@Override
public void update(Person person) {
System.out.println("***执行update()方法***");
maps.remove(person.getId());
maps.put(person.getId(), person);
}
@Override
public Person getByIdPerson(Long id) {
System.out.println("***执行getByIdPerson()方法***");
return maps.get(id);
}
@Override
public void delete(Long id) {
System.out.println("***执行delete()方法***");
maps.remove(id);
}
}
4、使用Spring注解方式对这个Bean进行方法拦截
Java代码 收藏代码
@Aspect
public class MyInterceptor {
@Pointcut("execution(* cn.tzz.aop.annotation.service.impl..*.*(..))")
private void anyMethod(){}//定义切点
@Before("anyMethod() && args(person)")
public void doAccessCheck(Person person){
System.out.println(person.getName());
System.out.println("前置通知");
}
@AfterReturning("anyMethod()")
public void doAfter(){
System.out.println("后置通知");
}
@After("anyMethod()")
public void after(){
System.out.println("最终通知");
}
@AfterThrowing("anyMethod()")
public void doAfterThrow(){
System.out.println("异常通知");
}
@Around("anyMethod()")
public Object doBasicProfiling(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
System.out.println("进入环绕通知");
Object object = proceedingJoinPoint.proceed();//执行该方法
System.out.println("退出方法");
return object;
}
}
Java代码 收藏代码
@Pointcut("execution(* cn.tzz.aop.annotation.service.impl..*.*(..))")
上述是定义方法切入点,execution为执行的意思,*代表任意返回值,然后是包名,.*意思是包下面的所有子包,(..)代表各种方法.
5、在Spring的配置文件中配置Bean,需要打开AOP命名空间
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:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="cn.tzz.aop.annotation" />
<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id="personService" class="cn.tzz.aop.annotation.service.impl.PersonServiceImpl"></bean>
<bean id="myInterceptor" class="cn.tzz.aop.annotation.MyInterceptor"></bean>
</beans>
6、测试
Java代码 收藏代码
public class TestAop {
private static ApplicationContext ctx = null;
private static PersonService personService = null;
static{
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
personService = (PersonService)ctx.getBean("personService");
}
public void testSave(){
Person person = new Person();
person.setId(1L);
person.setName("abc");
personService.save(person);
}
public void testGetByIdPerson(){
Person p = personService.getByIdPerson(1L);
System.out.println(p.getId()+"---"+p.getName());
}
public void testUpdate(){
Person person = new Person();
person.setId(1L);
person.setName("abc_1");
personService.update(person);
}
public void testDelete(){
personService.delete(1L);
}
@Test
public void testInteceptor(){
testSave();
// testGetByIdPerson();
// testUpdate();
// testGetByIdPerson();
// testDelete();
// testGetByIdPerson();
}
}
7、测试结果
Java代码 收藏代码
abc
前置通知
进入环绕通知
***执行save方法***
后置通知
退出方法
最终通知
发表评论
-
Spring Boot
2017-09-26 09:51 287Spring Boot是由Pivotal团 ... -
spring AOP中切点
2017-08-25 09:59 902在spring AOP中,需要使用AspectJ的切点表达式 ... -
Spring JdbcTemplate详解
2017-07-19 16:12 590JdbcTemplate简介 Spring对数据库的操 ... -
Spring相关
2017-04-20 16:10 457我是一个Java开发者,之前知道Spring属于这个公司,就 ... -
spring.schemas、spring.handlers的使用
2017-02-28 13:55 1720报错信息:Configuration problem: Un ... -
Spring的一个命名空间的名称空间处理程序没有找到
2017-02-25 15:20 9441. 问题 本文将讨论Spring中最常见的配置问题 —— ... -
到底EJB是什么
2016-12-06 10:05 446到底EJB是什么?被口口相传的神神秘秘的,百度一番,总觉得 ... -
Spring MVC 和 Servlet 一样,都不是线程安全的
2016-04-28 01:06 675你的理解是对的,Spring MVC 和 Servlet 一 ... -
springmvc的control 的线程是否安全的问题
2016-05-31 10:09 359关于java Servlet,Struts,springM ... -
框架的一些学习
2016-02-03 14:53 258java aopalliance-1.0.jar这个包是AOP ... -
Metrics介绍和Spring的集成
2016-02-02 16:56 969Metrics可以为你的代码的运行提供无与伦 ... -
spring mvc常用的注解
2016-01-22 14:28 702spring mvc常用的注解: ... -
Spring的常用注解
2016-01-20 16:07 655Spring2.5引入注解式处理器 @Controlle ... -
通过Spring的配置,添加多个数据源,制作多个qlMapClient,iBatis或Hibernate的各个DAO
2016-12-27 10:25 515通过Spring的配置,添加多个数据源,制作多个qlMapCl ... -
springmvc避免IE执行AJAX时,返回JSON出现下载文件
2017-01-01 23:35 864<!-- 避免IE执行AJAX时,返回JSON出现下载文 ... -
springMVC的@ResponseBody出现乱码解决方法
2017-01-02 00:23 378使用@ResponseBody出现乱码解决方法 1、 Re ... -
Spring中的Bean的注入方式
2017-01-02 00:27 537一 setter方法注入 配置文件如下: <bean ... -
spring发送邮件配置文件
2017-01-02 00:27 12711、发送邮件配置文件springmail_config ... -
@Resource和@Autowire的区别
2017-01-02 00:27 699@Resource和@Autowire的区别 在java代码中 ... -
Spring中继承并简化了Quartz
2017-01-02 00:27 668Quartz是一个强大的企业级任务调度框架,Spring中继承 ...
相关推荐
在Spring框架中,AOP(面向切面编程)是一...Spring AOP注解的应用使得切面编程更加简单直观,大大简化了对横切关注点的管理。在实际开发中,结合Spring提供的其他特性,如事务管理,可以构建出高效、健壮的后端系统。
总结起来,Spring AOP注解版通过简单易懂的注解,使得面向切面编程变得更加直观和方便。它降低了横切关注点与业务逻辑之间的耦合度,提高了代码的可维护性和复用性。通过合理利用这些注解,开发者可以轻松地实现日志...
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、可在现有源码上快速进行功能扩展 4、spring boot,mybatis,druid,spring aop的使用
**Spring AOP 注解例子详解** 在 Spring 框架中,面向切面编程(Aspect Oriented Programming,AOP)是一种强大的设计模式,它允许我们分离关注点,将业务逻辑与系统服务(如日志、事务管理等)解耦。在 Spring AOP...
下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### 注解方式 #### 1. 定义切面(Aspect) 在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect ...
本篇文章将深入探讨如何通过Spring的注解方式实现AOP的细节。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或责任。切点(Pointcut)定义了哪些方法会被通知(Advice...
在Spring AOP中,我们可以利用注解来实现切面,使得代码更加简洁、易读。本篇文章将深入探讨如何使用注解方式在Spring AOP中实现内部方法的拦截。 首先,理解AOP的基本概念至关重要。AOP的核心是切面(Aspect),它...
在这个"SpringAOP注解方式"的示例中,我们将深入探讨如何使用注解来实现Spring AOP的功能。 首先,Spring AOP通过两种主要的方式来定义切面:XML配置和注解。本示例主要关注注解方式,因为它提供了更简洁、更直观的...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...
在Spring AOP中,我们可以通过注解配置来实现切面编程,从而简化代码并提高可维护性。 首先,我们需要了解Spring AOP中的核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,它包含了横切关注点(如日志)和...
本篇将深入讲解如何通过注解来配置Spring AOP,以实现更加简洁、高效的代码编写。 首先,我们来看注解在Spring AOP中的应用。在传统的AOP配置中,我们需要定义切入点表达式和通知(advice)在XML配置文件中。然而,...
Spring支持两种AOP的实现方式:Spring AspectJ注解风格和Spring XML配置风格。使用AspectJ注解风格是最常见的,它允许开发者直接在方法上使用注解来定义切面。 Spring AOP中有五种不同类型的的通知(Advice): 1....
本篇我们将深入探讨如何使用注解的方式来实现Spring AOP开发。 ### 一、注解基础 在Spring AOP中,主要使用以下几种注解: 1. `@Aspect`:定义一个切面类,切面是AOP的核心,包含通知(advisors)和切点...
而注解在Spring AOP中的应用,使得配置变得更加简洁和直观。 首先,让我们理解什么是切片(Aspect)。在AOP中,切片是关注点的一个模块化单元,它封装了跨越多个对象的代码。例如,事务管理就是一个切片,它涉及到...
在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限...在实际项目中,合理地使用AOP注解,可以让我们更好地应对复杂的应用场景,实现解耦和模块化的代码设计。
**Spring AOP 注解使用详解** 在Java世界中,Spring框架以其强大的功能和灵活性而备受推崇,其中AOP(Aspect-Oriented ...通过理解上述概念和实践案例,你将能够更有效地利用Spring AOP注解来优化和组织你的代码。
本篇文章将深入探讨Spring AOP注解所依赖的三个核心JAR包:aspectjrt.jar、aspectjweaver.jar以及aopalliance.jar,并阐述它们在AOP框架中的作用。 首先,`aspectjrt.jar`是AspectJ运行时库,它是AspectJ编译器和织...
在Spring中,我们通常使用基于注解的AOP,它简化了配置并使代码更易读。 二、注解驱动的AOP 1. 定义切面(Aspect):首先,我们需要创建一个切面类,这个类通常包含通知(Advice),也就是实际的日志记录方法。使用...
"Spring AOP + 注解实现统一注解功能" 本文我们通过Spring AOP和Java的自定义注解来实现日志的插入功能,该方案对原有业务入侵较低,实现较灵活。下面我们将详细介绍该功能的实现原理和相关知识点。 1. 概述 在...