17、Spring實戰:利用AOP實現日誌監控
阿新 • • 發佈:2019-02-04
本例用利用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登入失敗!使用者名稱密碼錯誤!
*/