当前位置: 移动技术网 > IT编程>开发语言>Java > spring aop两种配置方式

spring aop两种配置方式

2019年07月22日  | 移动技术网IT编程  | 我要评论

第一种:注解配置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两种配置方式的文章和大家分享,一定要继续关注哦

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网