欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring aop两种配置方式

程序员文章站 2024-03-05 19:02:19
第一种:注解配置aop 注解配置aop(使用 aspectj 类库实现的),大致分为三步: 1. 使用注解@aspect来定义一个切面,在切面中定义切入点(@poin...

第一种:注解配置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; 
import com.bjsxt.model.user; 
 
@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; 
import org.springframework.stereotype.component; 
 
import com.bjsxt.dao.userdao; 
import com.bjsxt.model.user; 
 
 
@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; 
import org.springframework.stereotype.component; 
 
@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> 

测试类:

package com.bjsxt.service; 
import org.junit.test; 
import org.springframework.context.applicationcontext; 
import org.springframework.context.support.classpathxmlapplicationcontext; 
 
import com.bjsxt.model.user; 
 
//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

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

<?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"/> 
 <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> 

下面的<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这种标签了。

以上就是spring aop两种配置方式,大家了解了吗?之后还有更多关于spring aop两种配置方式的文章和大家分享,一定要继续关注哦