`
zhaomengsen
  • 浏览: 210455 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

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

阅读更多
转载于: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这种标签了。


分享到:
评论

相关推荐

    spring aop注解方式、xml方式示例

    Spring AOP提供了注解和XML两种方式来实现切面编程。注解方式更加简洁,易于理解和维护,适用于大多数情况。而XML配置方式则在复杂场景下更具灵活性,如需要动态调整切面配置时。在实际项目中,可以根据需求选择适合...

    SpringAop两种配置demo

    Spring AOP,全称Spring面向切面编程,是Spring框架中的一个重要组成部分,它提供了一种在不修改原有代码的情况下,对...了解并熟练掌握这两种配置方式,能够帮助我们更好地利用Spring AOP提高代码的可维护性和复用性。

    Spring-AOP.rar_spring aop 日志

    Spring AOP,全称为Aspect-Oriented Programming,是Spring框架中的一个重要组成部分,主要用来处理系统的横切关注点,如日志记录、事务管理、性能监控等。这些关注点通常会分散在应用程序的各个角落,而AOP就是为了...

    Spring学习笔记(16)----使用Spring配置文件实现AOP

    在本篇Spring学习笔记中,我们将深入探讨如何利用Spring配置文件来实现面向切面编程(AOP)。面向切面编程是Spring框架的核心特性之一,它允许我们把关注点分离,将横切关注点(如日志、事务管理、权限控制等)与...

    Spring_ch01-2.zip_springAOP

    在Spring AOP中,这两种类型的advice(通知)是实现切面功能的主要方式: 1. BeforeAdvice:在目标方法被调用之前执行的代码块。它允许我们在方法执行前进行预处理,例如检查权限、初始化数据等。在资源包中,我们...

    spring-aop标签和配置文件两种方式实例

    综上所述,Spring AOP提供了通过XML配置和AOP标签两种方式来实现切面编程,帮助开发者更高效地组织代码,降低维护成本。无论选择哪种方式,理解切入点表达式、通知类型和切面的概念都是至关重要的。在Spring 2.5及...

    spring aop demo 两种实现方式

    本示例提供了一种通过注解和配置文件两种方式实现Spring AOP的方法。 首先,我们来详细讲解通过注解实现Spring AOP。在Spring中,我们可以使用`@Aspect`注解来定义一个切面,这个切面包含了多个通知(advice),即...

    spring AOP配置的几种方式

    通过以上两种配置方式,我们可以看到Spring AOP提供了非常灵活且强大的功能。使用`ProxyFactoryBean`可以针对单个对象进行精确控制,而`DefaultAdvisorAutoProxyCreator`则更适合于自动化的场景,特别是当项目中有...

    开源框架spring详解-----AOP的深刻理解

    标题 "开源框架spring详解-----AOP的深刻理解" 指向的是对Spring框架中核心概念之一的面向切面编程(Aspect Oriented Programming, AOP)的深入探讨。AOP是Spring用来解决横切关注点问题的一种编程模式,它允许...

    spring-aop.rar_java aop

    Spring AOP提供了两种实现方式:基于代理(Proxy-based AOP)和基于注解(Annotation-based AOP)。 1. **基于代理的AOP**:Spring默认使用JDK动态代理或CGLIB代理来创建目标对象的代理。JDK动态代理适用于实现了...

    day39-Spring 06-Spring的AOP:带有切点的切面

    在Spring框架中,AOP(Aspect Oriented Programming,面向切面编程)是一种强大的设计模式,它允许程序员将关注点从核心业务逻辑中分离出来,如日志、事务管理等。在"day39-Spring 06-Spring的AOP:带有切点的切面...

    spring-aop

    Spring支持运行时织入和编译时织入两种方式。 在实际使用Spring AOP时,可以通过注解或XML配置来定义切面。例如,我们可以使用`@Aspect`注解来声明一个类作为切面,使用`@Before`、`@After`等注解来定义通知,使用`...

    Java spring AOP源码

    Spring框架提供了一种强大的AOP实现方式,支持声明式的AOP,并且与Spring容器紧密结合。 #### 关键知识点解析 **1. **Spring AOP对于最外层函数的拦截范围** Spring AOP对于最外层的函数只拦截`public`方法,不...

    Java八股文-Spring AOP

    Spring AOP支持两种类型的代理机制来生成代理对象: 1. **JDK动态代理** - 特点:基于Java反射机制,仅适用于实现了接口的目标对象。 - 优点:生成速度快,运行时性能较好。 - 缺点:仅能针对接口编程。 2. **...

    spring-nested-aop.zip_aop_spring aop

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要组成部分。它提供了一种模块化和声明式的方式来处理横切关注点,如事务管理、日志记录、性能监控等,这些关注点通常会分散在...

    SpringAOP的注解配置

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要组成部分。它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在Spring AOP中,...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.jar

    CGLIB是一个高性能的代码生成库,它在许多Java框架中被广泛使用,如Spring AOP。CGLIB能够生成子类,从而实现对目标类的代理。在Spring中,当一个类没有实现接口时,Spring会使用CGLIB来创建代理对象,以便在不修改...

    Spring--3.Spring AOP-2

    在Spring AOP中,有两种主要的实现方式:基于接口的JDK动态代理和基于类的CGLIB代理。JDK代理适用于目标对象实现了接口的情况,而CGLIB则在目标对象没有接口时提供代理功能。 使用Spring AOP的步骤通常包括: 1. ...

Global site tag (gtag.js) - Google Analytics