1. 程式人生 > >17、Spring實戰:利用AOP實現日誌監控

17、Spring實戰:利用AOP實現日誌監控

本例用利用AOP來實現記錄使用者登入的功能。

登入業務

這裡我們簡單寫,在實際使用時與此類似

//使用者Bean
package com.codestd.springstudy.log;

public class User {

    private String username;
    private String password;

    public User() {
        super();
    }

    public User(String username, String password) {
        super();
        this
.username = username; this.password = password; } }

業務類

//自定義登入異常
public class AuthenticationException extends Exception {

    private static final long serialVersionUID = -5160585885606759616L;

    public AuthenticationException(String message) {
        super(message);
    }   

}
//介面
public interface UserService { public void login(User user) throws AuthenticationException; } //實現類 public class UserServiceImpl implements UserService { @Override public void login(User user) throws AuthenticationException { if("admin".equals(user.getUsername()) && "admin"
.equals(user.getPassword())){ System.out.println("登入成功"); }else{ throw new AuthenticationException("使用者名稱密碼錯誤!"); } } }

AOP切面

@Aspect
public class LoginMonitor {

    @Pointcut("execution(* com.codestd.springstudy.log.UserService.login(..))")
    public void loginPointcut(){};

    @Around("loginPointcut()")
    public Object afterLogin(ProceedingJoinPoint point) throws Throwable{
        User user = (User) point.getArgs()[0];
        System.out.println(user.getUsername()+"請求登入系統");
        Object obj ;
        try {
            obj = point.proceed();
        } catch (Throwable e) {
            System.out.println(user.getUsername()+"登入失敗!"+e.getMessage());
            throw e;
        }
        System.out.println(user.getUsername()+"已登入系統");
        return obj;
    }

}

配置

<bean id="userService" class="com.codestd.springstudy.log.UserServiceImpl" />
<bean class="com.codestd.springstudy.log.LoginMonitor" />
<aop:aspectj-autoproxy /> <!-- 支援@Aspect註解 -->

測試

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:log/applicationContext.xml"})
public class UserServiceImplTest {

    @Autowired
    private UserService userService;

    @Test
    public void testLogin() throws AuthenticationException {
        User user = new User("admin","admin");
        userService.login(user);
    }

}
/*
admin請求登入系統
登入成功
admin已登入系統
------------------------
admin請求登入系統
admin登入失敗!使用者名稱密碼錯誤!
*/