天天看点

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

package com.bjsxt.model; 

public class user { 

    private string username; 

    private string password; 

    public string getusername() { 

        return username; 

    } 

    public void setusername(string username) { 

        this.username = username; 

    public string getpassword() { 

        return password; 

    public void setpassword(string password) { 

        this.password = password; 

}

/** 

*接口类 

*/ 

package com.bjsxt.dao; 

import com.bjsxt.model.user; 

public interface userdao { 

    public void save(user user); 

实现接口:

package com.bjsxt.dao.impl; 

import org.springframework.stereotype.component; 

import com.bjsxt.dao.userdao; 

@component("u") 

public class userdaoimpl implements userdao { 

    public void save(user user) { 

        system.out.println("user save11d!"); 

        /*throw new runtimeexception("exception");*/ //抛异常 

操作类:

package com.bjsxt.service; 

import javax.annotation.resource; 

import org.springframework.beans.factory.annotation.autowired; 

import org.springframework.beans.factory.annotation.qualifier; 

@component("userservice") 

public class userservice { 

    private userdao userdao;   

    public void init() { 

        system.out.println("init"); 

    public void add(user user) { 

        userdao.save(user); 

    public userdao getuserdao() { 

        return userdao; 

    @resource(name="u") 

    public void setuserdao( userdao userdao) { 

        this.userdao = userdao; 

    public void destroy() { 

        system.out.println("destroy"); 

加入aop

package com.bjsxt.aop; 

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; 

import org.aspectj.lang.annotation.pointcut; 

@aspect 

@component 

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))")*/ 

    @before("mymethod()") 

    public void before() { 

        system.out.println("method staet"); 

    }  

    @after("mymethod()") 

    public void after() { 

        system.out.println("method after"); 

    @afterreturning("execution(public * com.bjsxt.dao..*.*(..))") 

    public void afterreturning() { 

        system.out.println("method afterreturning"); 

    @afterthrowing("execution(public * com.bjsxt.dao..*.*(..))") 

    public void afterthrowing() { 

        system.out.println("method afterthrowing"); 

配置文件

<?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: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 

           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行 --> 

    <context:annotation-config /> 

    <context:component-scan base-package="com.bjsxt"/>  <!-- 自动扫描 --> 

    <aop:aspectj-autoproxy/>  <!-- 要添加本行 --> 

</beans> 

测试类:

import org.junit.test; 

import org.springframework.context.applicationcontext; 

import org.springframework.context.support.classpathxmlapplicationcontext; 

//dependency injection 

//inverse of control 

public class userservicetest { 

    @test 

    public void testadd() throws exception { 

        classpathxmlapplicationcontext ctx = new classpathxmlapplicationcontext("applicationcontext.xml"); 

        userservice service = (userservice)ctx.getbean("userservice"); 

        system.out.println(service.getclass()); 

        service.add(new user()); 

        system.out.println("###"); 

        ctx.destroy(); 

结果:

class com.bjsxt.service.userservice$$enhancerbycglib$$7b201784

method staet

user save11d!

method afterreturning

method after

###

注意:

@aspect:意思是这个类为切面类

@componet:因为作为切面类需要 spring 管理起来,所以在初始化时就需要将这个类初始化加入 spring 的管理;

@befoe:切入点的逻辑(advice)

execution…:切入点语法

第二种:xml配置aop

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

    <context:component-scan base-package="com.bjsxt"/> 

    <bean id="loginterceptor" class="com.bjsxt.aop.loginterceptor"></bean> 

    <aop:config> 

        <aop:pointcut expression="execution(public * com.bjsxt.service..*.add(..))"  

        id="servicepointcut"/> 

        <aop:aspect id="logaspect" ref="loginterceptor"> 

            <aop:before method="before"  pointcut-ref="servicepointcut" /> 

        </aop:aspect> 

    </aop:config> 

下面的<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