第一种:注解配置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