Dado los siguientes fragmentos de código responder a las siguientes preguntas:
public interface DBAccess {
public void initConnection();
}public class DBAccessA implements DBAccess {
public DBAccessA() {}
public void initConnection() {
System.out.println("Init A connection with database..");
}
}public class DBAccessB implements DBAccess {
public DBAccessB() {}
public void initConnection() {
System.out.println("Init B connection with database..");
}
}public class DBClient {
private DBAccess dbAccess;
public DBClient(DBAccess dbAccess) {
this.dbAccess = dbAccess;
}
public void setDBAccess(DBAccess dbAccess) {
this.dbAccess = dbAccess;
}
public void getAllFromDataBase() {
dbAccess.initConnection();
System.out.println("Returning all data from database..");
}
public void getSomeDataFromDataBase() {
dbAccess.initConnection();
System.out.println("Returning some data from database..");
}
}public class Main {
public static void main(String args[]) {
DBAccess dbAccessB = new DBAccessB();
DBClient client = new DBClient(dbAccessB);
System.out.println("Querying all data from database..");
client.getAllFromDataBase();
DBAccess dbAccessA = new DBAccessA();
client.setDBAccess(dbAccessA);
System.out.println("Querying some data from database..");
client.getSomeDataFromDataBase();
}
}- ¿Se realiza inyección de dependencias entre las clases anteriores? Si es así, identifique la clase inyectora, el servicio y el cliente.
- En el caso de que exista inyección de dependencias, además indique:
- El método de inyección que se realiza (constructor, propiedad o método).
- La/s línea/s donde se realiza la inyección de dependencias.
Dado los siguientes fragmentos de código responder a las siguientes preguntas:
public class Bank {
public Bank() {}
public void createUser() {
System.out.println("Creating user..");
}
public void makeTransaction() {
System.out.println("Making transaction..");
}
public void takeMoneyOut() {
System.out.println("Taking money out..");
}
public void showUsers() {
System.out.println("Showing users..");
}
}public class Main {
private static Scanner input = new Scanner(System.in);
public static void main(String args[]) {
System.out.println("AspectJ Bank");
System.out.println("------------");
System.out.println("1 - Create user");
System.out.println("2 - Make transaction");
System.out.println("3 - Take money out");
System.out.println("4 - Show users");
System.out.println("5 - Exit");
int option = Integer.valueOf(input.nextLine());
Bank bank = new Bank();
switch(option) {
case 1:
bank.createUser();
break;
case 2:
bank.makeTransaction();
break;
case 3:
bank.takeMoneyOut();
break;
case 4:
bank.showUsers();
break;
case 5:
System.out.println("Exiting..");
break;
}
}
}import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class LoginAspect {
@Before("..TO-DO..")
public void before(JoinPoint joinPoint){
//...TO-DO..
}
@After("..TO-DO..")
public void after(JoinPoint joinPoint){
//...TO-DO..
}
}Para realizar el ejercicio, se usará maven como herramienta de construcción. Para editar el código fuente puede emplearse el entorno de desarrollo que se prefiera (vscode, etc.)
Puede emplear los siguientes comandos para compilar, limpiar y/o generar un fichero jar con todas las dependencias necesarias, preparado para ejecutar:
-
mvn compile— compilar todo el código del proyecto -
mvn clean— limpiar el proyecto -
mvn assembly:single— generar un jar con las dependencias -
mvn compile assembly:single— compilar y generar el jar
Para ejecutar, por ejemplo, una clase principal Main dentro del jar generado para el proyecto ejercicio-aspectj (según la configuración del pom.xml incluida en el proyecto), se puede usar el siguiente comando:
java -cp target/ejercicio-aspectj-0.0.1-SNAPSHOT-jar-with-dependencies.jar Main
El ejercicio está preparado para Java 1.8. Para versiones posteriores de Java 9, puede no funcionar. Para facilitar disponer de varias versiones de Java en la línea de comandos, se recomienda instalar jEnv y seleccionar una versión del JDK compatible con Java 1.8
Los pasos a completar son:
-
Descargar la plantilla del proyecto disponible en el Campus Virtual.
-
Completar en la clase
LoginAspect.javalas seccionesTO-DOde forma que se cumplan las siguientes condiciones:
a) Mostrar el mensaje "The login is required" antes de la ejecución de las operaciones makeTransaction y takeMoneyOut.
b) Mostrar el mensaje "The database is empty" después de la ejecución de la operación showUsers.
- Finalmente, sustituir el fichero
LoginAspect.javapor el ficheroLoginAspect.ajincluyendo la misma funcionalidad pero utilizando la sintaxis de AspectJ.
- AspectJ Hello World
- Cheat sheet para la definición de etiquetas en AspectJ
- Ejemplo de configuración de la etiqueta Before en AspectJ
- Ejemplo de configuración de la etiqueta After en AspectJ
- Implementar una anotación a medida de Spring AOP
- AOP Blog
- AspectJ Documentación oficial
- AspectJ en blog Java and Spring Development