Spring – 31 – Aspect Oriented Programming (AOP) – 05 – AspectJ with XML – Authenticate
Merhaba Arkadaslar
Onceki bolumde AspectJ ornegi uygulamistik. Bu bolumde de AspectJ ile AOP yaklasimini bir baska ornek uzerinde uygulayarak daha iyi anlamaya calisalim.
Model
UserData.java
package _36.aspectj.model; public class UserData { private String userName; private String password; private boolean locked; private int tryCount; // more //getters and setters }
Exception
ExceptionMessages.java
package _36.aspectj.exception; public interface ExceptionMessages { public static final String INVALID_USER_DATA = "Invalid user data."; public static final String USER_LOCKED = "The user is locked."; public static final String USER_NOT_PERMITTED = "User not permitted."; }
UserDataException.java
package _36.aspectj.exception; public class UserDataException extends Exception { private static final long serialVersionUID = 1L; private String errorMessage; public UserDataException(String errorMessage) { super(); this.errorMessage = errorMessage; } public String getErrorMessage() { return errorMessage; } public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } }
Service & Aspect
TransactionEngineService.java
TransactionEngine#processTransaction metodunda business logic’imiz olsun.
package _36.aspectj.service; import _36.aspectj.model.UserData; public class TransactionEngineService { public void processTransaction(UserData userData) { // business logic System.out.println("processTransaction is invoked..."); // // throw new RuntimeException(); } }
UserAuthenticator.java
UserAuthenticator#authenticateUser metodunda , cesitli kontroller olsun ;
package _36.aspectj.service; import _36.aspectj.exception.ExceptionMessages; import _36.aspectj.exception.UserDataException; import _36.aspectj.model.UserData; public class UserAuthenticator { public void authenticateUser(UserData userData) throws UserDataException { if (userData == null) { throw new UserDataException(ExceptionMessages.INVALID_USER_DATA); } if (userData.isLocked()) { throw new UserDataException(ExceptionMessages.USER_LOCKED); } if (userData.getTryCount() > 5) { userData.setLocked(true); } /// boolean hasPermission = checkPermission(1000); if (!hasPermission) { throw new UserDataException(ExceptionMessages.USER_NOT_PERMITTED); } // // more logic about authetication } public boolean checkPermission(int permissionId) { /// // check permission // return true; } }
UserAuthenticatorAspect.java
package _36.aspectj.service; import _36.aspectj.exception.UserDataException; import _36.aspectj.model.UserData; public class UserAuthenticatorAspect { public void authenticateBefore(UserData userData) { System.out.println("UserAuthenticatorAspect#authenticateBefore is invoked..."); UserAuthenticator authenticator = new UserAuthenticator(); try { authenticator.authenticateUser(userData); } catch (UserDataException e) { System.out.println("Exception caught!"); System.out.println(e.getErrorMessage()); } } }
LoggingServiceAspect.java
package _36.aspectj.service; public class LoggingServiceAspect { public void logger(Exception exception) { System.out.println("LoggingServiceAspect#logger is invoked..."); System.out.println(exception); } }
36.aspectj.xml
<?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:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id="transactionEngineService" class="_36.aspectj.service.TransactionEngineService" /> <bean id="userAuthenticatorAspectId" class="_36.aspectj.service.UserAuthenticatorAspect" /> <bean id="loggingServiceAspectId" class="_36.aspectj.service.LoggingServiceAspect" /> <aop:config> <aop:aspect id="authenticatorAspect" ref="userAuthenticatorAspectId"> <!-- Before --> <aop:pointcut id="pointCutBeforeId" expression="execution(* *.processTransaction(..)) and args(userData)" /> <aop:before method="authenticateBefore" pointcut-ref="pointCutBeforeId" /> </aop:aspect> <aop:aspect id="logAspect" ref="loggingServiceAspectId"> <!-- AfterThrowing --> <aop:pointcut id="pointCutAfterThrowingId" expression="execution(* *.processTransaction(..))" /> <aop:after-throwing method="logger" throwing="exception" pointcut-ref="pointCutAfterThrowingId" /> </aop:aspect> </aop:config> </beans>
Run Application
AspectJTest.java
processTransaction metoduna UserData modelimizi veriyoruz. Bu metot calismadan once UserAuthenticatorAspect#authenticateBefore metodu calisacaktir.
package _36.aspectj.test; import org.springframework.context.support.ClassPathXmlApplicationContext; import _36.aspectj.model.UserData; import _36.aspectj.service.TransactionEngineService; public class AspectJTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("36.aspectj.xml"); TransactionEngineService transactionEngineService = context.getBean("transactionEngineService", TransactionEngineService.class); UserData userData = new UserData(); try { transactionEngineService.processTransaction(userData); } catch (Exception e) { System.out.println("AspectJTest#main"); } context.close(); } }
Ornegimizi calistirdigimizda before aspect type kullandigimiz icin processTransaction oncesinde UserAuthenticatorAspect#authenticateBefore metodu calisacaktir.
sonrasinda processTransaction calismasina devam edecektir , processTransaction metodunda bir RuntimeException firlatiyoruz ,After Throwing aspect yaklasimini kullandigimiz icin LoggingServiceAspect#logger metodu calisacaktir.
UserAuthenticatorAspect#authenticateBefore is invoked... processTransaction is invoked... LoggingServiceAspect#logger is invoked... java.lang.RuntimeException AspectJTest#main
Github kaynak dosyalar/ source folder
leventerguder/injavawetrust-spring-tutorial
Yazimi burada sonlandiriyorum.
Herkese bol Javali gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer
Leave a Reply