- 浏览: 210455 次
- 性别:
- 来自: 河北
文章分类
最新评论
-
6420285:
你的文章很棒,很多地方讲的通俗易懂,非常感谢。 ...
深入掌握JMS(一):JSM基础 -
xs.cctv:
不错
zeroDateTimeBehavior=convertToNull -
hanyannan0123:
搞不清楚,此话属于经典呢,还是废话。
超类 好 -
czy584521:
```我肯定他用了谷歌金山词霸
IBM的面试官被我忽悠蒙了 -
yuantong:
老板跳槽?什么概念
我们老板跳槽了 !!!
转载于:http://www.itxuexiwang.com/a/shujukujishu/2016/0206/81.html
第一种:注解配置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
package com.bjsxt.model;
#p#分页标题#e#public class User {
private String username;
private String password;
public String getUsername() {
return username;
#p#分页标题#e# }
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return#p#分页标题#e# password;
}
public void setPassword(String password) {
this.password = password;
}
}
#p#分页标题#e#
/**
*接口类
*/
package com.bjsxt.dao;
import com.bjsxt.model.User;
#p#分页标题#e#
public interface UserDAO {
public void save(User user);
}
实现接口:
#p#分页标题#e#
package com.bjsxt.dao.impl;
import org.springframework.stereotype.Component;
import com.bjsxt.dao.UserDAO;
import#p#分页标题#e# com.bjsxt.model.User;
@Component("u")
public class UserDAOImpl implements UserDAO {
public#p#分页标题#e# void save(User user) {
System.out.println("user save11d!");
/*throw new RuntimeException("exception");*/ //抛异常
}
#p#分页标题#e#}
操作类:
package com.bjsxt.service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
#p#分页标题#e#import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.bjsxt.dao.UserDAO;
import com.bjsxt.model.User;
#p#分页标题#e#
@Component("userService")
public class UserService {
private UserDAO userDAO;
#p#分页标题#e# public void init() {
System.out.println("init");
}
public void add(User user) {
userDAO.save(user); #p#分页标题#e#
}
public UserDAO getUserDAO() {
return userDAO;
}
@Resource(name=#p#分页标题#e#"u")
public void setUserDAO( UserDAO userDAO) {
this.userDAO = userDAO;
}
public void#p#分页标题#e# destroy() {
System.out.println("destroy");
}
}
加入aop
package com.bjsxt.aop;
#p#分页标题#e#
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before; #p#分页标题#e#
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
#p#分页标题#e#public class LogInterceptor {
@Pointcut("execution(public * com.bjsxt.service..*.add(..))")
public void myMethod(){};
/*@Before("execution(public void com.bjsxt.dao.impl.UserDAOImpl.save(com.bjsxt.model.User))")*/#p#分页标题#e#
@Before("myMethod()")
public void before() {
System.out.println("method staet");
}
#p#分页标题#e#@After("myMethod()")
public void after() {
System.out.println("method after");
}
@AfterReturning("execution(public * com.bjsxt.dao..*.*(..))")
#p#分页标题#e# public void AfterReturning() {
System.out.println("method AfterReturning");
}
@AfterThrowing("execution(public * com.bjsxt.dao..*.*(..))")
public void AfterThrowing() { #p#分页标题#e#
System.out.println("method AfterThrowing");
}
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
#p#分页标题#e#<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
#p#分页标题#e# http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd #p#分页标题#e#
"><!-- 要添加最后2行 -->
<context:annotation-config />
<context:component-scan base-package="com.bjsxt"/> <!-- 自动扫描 -->
<aop:aspectj-autoproxy/> <!-- 要添加本行 -->
#p#分页标题#e#</beans>
测试类:
package com.bjsxt.service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; #p#分页标题#e#
import com.bjsxt.model.User;
//Dependency Injection
//Inverse of Control
public#p#分页标题#e# class UserServiceTest {
@Test
public void testAdd() throws Exception {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); #p#分页标题#e#
UserService service = (UserService)ctx.getBean("userService");
System.out.println(service.getClass());
service.add(new User());
System.out.println("###"#p#分页标题#e#);
ctx.destroy();
}
}
结果:
class com.bjsxt.service.UserService$$EnhancerByCGLIB$$7b201784 method staet user save11d! method AfterReturning method after ###
#p#分页标题#e#注意:
@Aspect:意思是这个类为切面类 @Componet:因为作为切面类需要 Spring 管理起来,所以在初始化时就需要将这个类初始化加入 Spring 的管理; @Befoe:切入点的逻辑(Advice) execution…:切入点语法
第二种:xml配置aop
实例同上:只是配置文件不同
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
#p#分页标题#e# xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
#p#分页标题#e# http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
"><!-- 要添加最后2行 --> #p#分页标题#e#
<context:annotation-config />
<context:component-scan base-package="com.bjsxt"/>
<bean id="logInterceptor" class="com.bjsxt.aop.LogInterceptor"></bean>
<aop:config> #p#分页标题#e#
<aop:pointcut expression="execution(public * com.bjsxt.service..*.add(..))"
id="servicePointcut"/>
<aop:aspect id="logAspect" ref="logInterceptor">
<aop:before method="before" pointcut-ref="servicePointcut" />
#p#分页标题#e# </aop:aspect>
</aop:config>
</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相关。#p#分页标题#e#
xmlns:tx:
Spring中与事务相关的配置内容。
一个XML文件,只能声明一个默认的语义解析的规范。
例如上面的xml中就只有beans一个是默认的,其他的都需要通过特定的标签来使用,比如aop,它自己有很多的属性,如果要使用,前面就必须加上aop:xxx才可以。比如上面的aop:config。
类似的,如果默认的xmlns配置的是aop相关的语义解析规范,那么在xml中就可以直接写config这种标签了。
第一种:注解配置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
package com.bjsxt.model;
#p#分页标题#e#public class User {
private String username;
private String password;
public String getUsername() {
return username;
#p#分页标题#e# }
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return#p#分页标题#e# password;
}
public void setPassword(String password) {
this.password = password;
}
}
#p#分页标题#e#
/**
*接口类
*/
package com.bjsxt.dao;
import com.bjsxt.model.User;
#p#分页标题#e#
public interface UserDAO {
public void save(User user);
}
实现接口:
#p#分页标题#e#
package com.bjsxt.dao.impl;
import org.springframework.stereotype.Component;
import com.bjsxt.dao.UserDAO;
import#p#分页标题#e# com.bjsxt.model.User;
@Component("u")
public class UserDAOImpl implements UserDAO {
public#p#分页标题#e# void save(User user) {
System.out.println("user save11d!");
/*throw new RuntimeException("exception");*/ //抛异常
}
#p#分页标题#e#}
操作类:
package com.bjsxt.service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
#p#分页标题#e#import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.bjsxt.dao.UserDAO;
import com.bjsxt.model.User;
#p#分页标题#e#
@Component("userService")
public class UserService {
private UserDAO userDAO;
#p#分页标题#e# public void init() {
System.out.println("init");
}
public void add(User user) {
userDAO.save(user); #p#分页标题#e#
}
public UserDAO getUserDAO() {
return userDAO;
}
@Resource(name=#p#分页标题#e#"u")
public void setUserDAO( UserDAO userDAO) {
this.userDAO = userDAO;
}
public void#p#分页标题#e# destroy() {
System.out.println("destroy");
}
}
加入aop
package com.bjsxt.aop;
#p#分页标题#e#
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before; #p#分页标题#e#
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
#p#分页标题#e#public class LogInterceptor {
@Pointcut("execution(public * com.bjsxt.service..*.add(..))")
public void myMethod(){};
/*@Before("execution(public void com.bjsxt.dao.impl.UserDAOImpl.save(com.bjsxt.model.User))")*/#p#分页标题#e#
@Before("myMethod()")
public void before() {
System.out.println("method staet");
}
#p#分页标题#e#@After("myMethod()")
public void after() {
System.out.println("method after");
}
@AfterReturning("execution(public * com.bjsxt.dao..*.*(..))")
#p#分页标题#e# public void AfterReturning() {
System.out.println("method AfterReturning");
}
@AfterThrowing("execution(public * com.bjsxt.dao..*.*(..))")
public void AfterThrowing() { #p#分页标题#e#
System.out.println("method AfterThrowing");
}
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
#p#分页标题#e#<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
#p#分页标题#e# http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd #p#分页标题#e#
"><!-- 要添加最后2行 -->
<context:annotation-config />
<context:component-scan base-package="com.bjsxt"/> <!-- 自动扫描 -->
<aop:aspectj-autoproxy/> <!-- 要添加本行 -->
#p#分页标题#e#</beans>
测试类:
package com.bjsxt.service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; #p#分页标题#e#
import com.bjsxt.model.User;
//Dependency Injection
//Inverse of Control
public#p#分页标题#e# class UserServiceTest {
@Test
public void testAdd() throws Exception {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); #p#分页标题#e#
UserService service = (UserService)ctx.getBean("userService");
System.out.println(service.getClass());
service.add(new User());
System.out.println("###"#p#分页标题#e#);
ctx.destroy();
}
}
结果:
class com.bjsxt.service.UserService$$EnhancerByCGLIB$$7b201784 method staet user save11d! method AfterReturning method after ###
#p#分页标题#e#注意:
@Aspect:意思是这个类为切面类 @Componet:因为作为切面类需要 Spring 管理起来,所以在初始化时就需要将这个类初始化加入 Spring 的管理; @Befoe:切入点的逻辑(Advice) execution…:切入点语法
第二种:xml配置aop
实例同上:只是配置文件不同
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
#p#分页标题#e# xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
#p#分页标题#e# http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
"><!-- 要添加最后2行 --> #p#分页标题#e#
<context:annotation-config />
<context:component-scan base-package="com.bjsxt"/>
<bean id="logInterceptor" class="com.bjsxt.aop.LogInterceptor"></bean>
<aop:config> #p#分页标题#e#
<aop:pointcut expression="execution(public * com.bjsxt.service..*.add(..))"
id="servicePointcut"/>
<aop:aspect id="logAspect" ref="logInterceptor">
<aop:before method="before" pointcut-ref="servicePointcut" />
#p#分页标题#e# </aop:aspect>
</aop:config>
</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相关。#p#分页标题#e#
xmlns:tx:
Spring中与事务相关的配置内容。
一个XML文件,只能声明一个默认的语义解析的规范。
例如上面的xml中就只有beans一个是默认的,其他的都需要通过特定的标签来使用,比如aop,它自己有很多的属性,如果要使用,前面就必须加上aop:xxx才可以。比如上面的aop:config。
类似的,如果默认的xmlns配置的是aop相关的语义解析规范,那么在xml中就可以直接写config这种标签了。
发表评论
-
UDF 底层实现
2017-01-04 00:03 755用户自定义函数 继承UDF,重写evaluate方法即可 ... -
MetadataCleaner
2016-12-09 23:09 762MetadataCleaner运行定时任务周期性的清理元数据( ... -
黑马程序员_java08_多线程
2016-03-13 13:01 444转载于:http://www.itxuexiwang.com/ ... -
Redis数据库的安装配置方
2016-02-23 11:27 791转载于:http://www.itxuexiwang.com/ ... -
通过 Redis 实现 RPC 远程方法调用(支持多种编程语
2016-02-23 11:27 843转载于:http://www.itxuexiwang.com/ ... -
CentOS Linux系统下安装Redis过程和配置参数说明
2016-02-28 18:39 602转载于:http://www.itxuexiwang.com/ ... -
NoSQL和Redis简介及Redis在Windows下的安装和使用教程
2016-02-23 11:28 664转载于:http://www.itxuexiwang.com/ ... -
64位Windows下安装Redis教程
2016-03-10 14:06 713转载于:http://www.itxuexiwang.com/ ... -
让Redis在你的系统中发挥更大作用的几点建议
2016-03-10 14:06 1003转载于:http://www.itxuexiw ... -
Redis主从复制问题和扩容问题的解决思路
2016-02-25 13:26 998转载于:http://www.itxuexiw ... -
redis常用命令小结
2016-03-11 12:11 713转载于:http://www.itxuexiwang.com/ ... -
Redis中5种数据结构的使用场景介绍
2016-02-25 13:27 715转载于:http://www.itxuexiw ... -
redis中使用redis-dump导出、导入、还原数据实例
2016-02-25 13:26 1309转载于:http://www.itxuexiwang.com/ ... -
Redis批量删除KEY的方法
2016-02-26 17:24 759Redis 中有删除单个 Key 的指令 DEL,但好像没有批 ... -
超强、超详细Redis数据库入门教程
2016-02-28 18:39 572转载于:http://www.itxuexiw ... -
Redis总结笔记(一):安装和常用命令
2016-02-26 17:23 535转载于:http://www.itxuexiw ... -
Redis总结笔记(二):C#连接Redis简单例子
2016-02-26 17:24 725转载于:http://www.itxuexiwang.com/ ... -
redis启动流程介绍
2016-03-10 14:07 634转载于:http://www.itxuexiwang.com/ ... -
redis中使用java脚本实现分布式锁
2016-03-13 13:03 588转载于:http://www.itxuexiwang.com/ ... -
redis常用命令、常见错误、配置技巧等分享
2016-02-26 17:23 533转载于:http://www.itxuexiwang.com/ ...
相关推荐
Spring AOP提供了注解和XML两种方式来实现切面编程。注解方式更加简洁,易于理解和维护,适用于大多数情况。而XML配置方式则在复杂场景下更具灵活性,如需要动态调整切面配置时。在实际项目中,可以根据需求选择适合...
Spring AOP,全称Spring面向切面编程,是Spring框架中的一个重要组成部分,它提供了一种在不修改原有代码的情况下,对...了解并熟练掌握这两种配置方式,能够帮助我们更好地利用Spring AOP提高代码的可维护性和复用性。
Spring AOP,全称为Aspect-Oriented Programming,是Spring框架中的一个重要组成部分,主要用来处理系统的横切关注点,如日志记录、事务管理、性能监控等。这些关注点通常会分散在应用程序的各个角落,而AOP就是为了...
在本篇Spring学习笔记中,我们将深入探讨如何利用Spring配置文件来实现面向切面编程(AOP)。面向切面编程是Spring框架的核心特性之一,它允许我们把关注点分离,将横切关注点(如日志、事务管理、权限控制等)与...
在Spring AOP中,这两种类型的advice(通知)是实现切面功能的主要方式: 1. BeforeAdvice:在目标方法被调用之前执行的代码块。它允许我们在方法执行前进行预处理,例如检查权限、初始化数据等。在资源包中,我们...
综上所述,Spring AOP提供了通过XML配置和AOP标签两种方式来实现切面编程,帮助开发者更高效地组织代码,降低维护成本。无论选择哪种方式,理解切入点表达式、通知类型和切面的概念都是至关重要的。在Spring 2.5及...
本示例提供了一种通过注解和配置文件两种方式实现Spring AOP的方法。 首先,我们来详细讲解通过注解实现Spring AOP。在Spring中,我们可以使用`@Aspect`注解来定义一个切面,这个切面包含了多个通知(advice),即...
通过以上两种配置方式,我们可以看到Spring AOP提供了非常灵活且强大的功能。使用`ProxyFactoryBean`可以针对单个对象进行精确控制,而`DefaultAdvisorAutoProxyCreator`则更适合于自动化的场景,特别是当项目中有...
标题 "开源框架spring详解-----AOP的深刻理解" 指向的是对Spring框架中核心概念之一的面向切面编程(Aspect Oriented Programming, AOP)的深入探讨。AOP是Spring用来解决横切关注点问题的一种编程模式,它允许...
Spring AOP提供了两种实现方式:基于代理(Proxy-based AOP)和基于注解(Annotation-based AOP)。 1. **基于代理的AOP**:Spring默认使用JDK动态代理或CGLIB代理来创建目标对象的代理。JDK动态代理适用于实现了...
在Spring框架中,AOP(Aspect Oriented Programming,面向切面编程)是一种强大的设计模式,它允许程序员将关注点从核心业务逻辑中分离出来,如日志、事务管理等。在"day39-Spring 06-Spring的AOP:带有切点的切面...
Spring支持运行时织入和编译时织入两种方式。 在实际使用Spring AOP时,可以通过注解或XML配置来定义切面。例如,我们可以使用`@Aspect`注解来声明一个类作为切面,使用`@Before`、`@After`等注解来定义通知,使用`...
Spring框架提供了一种强大的AOP实现方式,支持声明式的AOP,并且与Spring容器紧密结合。 #### 关键知识点解析 **1. **Spring AOP对于最外层函数的拦截范围** Spring AOP对于最外层的函数只拦截`public`方法,不...
Spring AOP支持两种类型的代理机制来生成代理对象: 1. **JDK动态代理** - 特点:基于Java反射机制,仅适用于实现了接口的目标对象。 - 优点:生成速度快,运行时性能较好。 - 缺点:仅能针对接口编程。 2. **...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要组成部分。它提供了一种模块化和声明式的方式来处理横切关注点,如事务管理、日志记录、性能监控等,这些关注点通常会分散在...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要组成部分。它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在Spring AOP中,...
CGLIB是一个高性能的代码生成库,它在许多Java框架中被广泛使用,如Spring AOP。CGLIB能够生成子类,从而实现对目标类的代理。在Spring中,当一个类没有实现接口时,Spring会使用CGLIB来创建代理对象,以便在不修改...
在Spring AOP中,有两种主要的实现方式:基于接口的JDK动态代理和基于类的CGLIB代理。JDK代理适用于目标对象实现了接口的情况,而CGLIB则在目标对象没有接口时提供代理功能。 使用Spring AOP的步骤通常包括: 1. ...