Spring 注解方式配置app:

注解配置AOP(使用 AspectJ 类库实现的),大致分为三步:

1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before, @AfterReturning,@After,@AfterThrowing,@Around).

2. 开发需要被拦截的类。

3. 将切面配置到xml中,当然,我们也可以使用自动扫描Bean的方式。这样的话,那就交由Spring AoP容器管理。

另外需要引用 aspectJ 的 jar 包: aspectjweaver.jar aspectjrt.jar


1  实体类:

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;

    }

}

2  dao 接口类:

package com.bjsxt.dao;

import com.bjsxt.model.User;


public interface UserDAO {

    public void save(User user);

}



3 dao 实现类

@Component("u")

public class UserDAOImpl implements UserDAO {


    public void save(User user) {


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

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

    }


}




4 service 服务类

@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");

    }

}


现在要对service 进行 aop 操作。


5 切面类:


@Aspect

@Component

public class LogInterceptor {

    @Pointcut("execution(public * com.bjsxt.service..*.add(..))")

    public void myMethod(){};


    @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");

    } 

}

解释类:


1 : 定义一个 切点,名字是myMethod.

@Pointcut("execution(public * com.bjsxt.service..*.add(..))")

    public void myMethod(){};

对应xml 配置: <aop:pointcut id="myMethod"  expression="execution(public * com.bjsxt.service..*.add(..))" />  



2 在myMethod切点执行之后,调用after 方法。

    @After("myMethod()")

    public void after() {

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

    } 

对应XML 配置:

<aop:after pointcut-ref="myMethod" method="after"/> 



3  在切点 execution(public * com.bjsxt.dao..*.*(..))  返回后,执行AfterReturning 方法。


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

    public void AfterReturning() {

        System.out.println("method AfterReturning");

    } 


对应 XML :


<aop:after-returning pointcut="execution(public * com.bjsxt.dao..*.*(..)) " method="afterReturning"/>  




spring 配置文件。


 <context:annotation-config />

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

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





你可能感兴趣的:(Spring 注解方式配置app:)