En la última entrada dedicada a AOP (podeis verla aquí ) analizamos de manera teórica las características básicas del lenguaje de definición de pointcuts. A continuación realizaremos una serie de ejemplos que intentarán clarificar los conceptos teóricos vistos en anteriores entradas.
- Signaturas de tipos
Patrón de la signatura | Descripción | Ejemplos de tipos concordantes |
---|---|---|
AstVisitor | El tipo AstVisitor | Sólo el tipo AstVisitor concuerda (ni tipos base ni derivados) |
*AstVisitor | Cualquier tipo cuyo nombre termine en AstVisitor | Por ejemplo, HighlightingAstVisitor o SemanticAstVisitor concuerdan con el patrón |
java.*.Date | El tipo Date en cualquier subpaquete directo del paquete java | java.util.Date o java.sql.Date son ejemplos de tipos concordantes |
javax..* | Cualquier tipo en el paquete javax y en sus subpaquetes (tanto directos como indirectos) | Cualquier tipo en el paquete javax.security así como cualquiera de sus subpaquetes indirectos como javax.security.auth.login |
javax..*Model | Todos los tipos en el paquete javax (subpaquetes directos e indirectos) cuyo nombre termine en Model, y todos los subtipos de estos. | TableModel, TreeModel y sus subtipos como DefaultTreeModel oDefaultTableModel. |
- Signaturas de tipos: anotaciones
Patrón de la signatura | Descripción | Ejemplos de tipos concordantes |
---|---|---|
@Secured User | El tipo User anotado con la anotación Secured | @Secured class User{. . .} |
@Entity * | Cualquier tipo anotado con la anotación Entity | @Entity class Section {. . .},@Entity class Report {. . .} |
@Transactional* Manager+ | El tipo Manager y cualquiera de sus clases derivadas que estén anotados con una anotación cuyo nombre comience por Transactional | @TransactionalDefault class Manager{},@TransactionalOracle class OracleManager extends Manager{} |
- Signaturas de tipos: generics
Patrón de la signatura | Descripción | Ejemplos de tipos concordantes |
---|---|---|
Map | El tipo Map cuyo primer argumento genérico está fijado a Integer y el segundo aString | En este caso únicamente concordará el tipo Map |
* | Cualquier tipo genérico cuyo único argumento genérico sea de tipo User | Collection |
Collection | El tipo Collection con un parámetro de tipo User o derivado | Collection |
Collection | El tipo Collection, cuyo parámetro será uno de los tipos base de User | Collection |
- Combinando pointcuts: operadores
Patrón de la signatura | Descripción | Ejemplos de tipos concordantes |
---|---|---|
!Collection | Cualquier tipo excepto Collection | User,Model, List (aunque sea subclase de Collection) |
Set || Map | Los tipos Set o Map | Los tipos Set y Map únicamente |
!@Transactional | Cualquier tipo que se encuentre anotado por la anotación Transactional | class NonTransactionalManager{} |
@Serializable @Encrypted * | Cualquier tipo que se encuentre anotado por las dos anotaciones | @Serializable @Encrypted class UserCredentials{} |
(@Serializable || @Encrypted) * | Cualquier tipo que esté anotado por alguna de las dos anotaciones | @Serializable class User {} |
- Signaturas de métodos y constructores
Patrón de la signatura | Descripción | Ejemplos de métodos concordantes |
---|---|---|
public void User.set*(*) | Cualquier método público de la clase User cuyo nombre comience por set, cuyo tipo de retorno sea void, y que espere un único argumento | class User{ public void setName(String name){} } |
public void User.*() | Cualquier método público de la clase User cuyo tipo de retorno sea void y que no espere argumentos | class User { public void updateInfo(){}} |
public * User.*() | Cualquier método público de la clase User que no espera argumentos y retorna cualquier tipo | class User{ public UserInfo getUserInfo(){}} |
public * User.*(..) | Cualquier método público de la clase User que retorna cualquier tipo, y espera cualquier número y tipo de argumentos (incluido cero) | class User{ public UserInfo getUserInfo(){},public Date updatesBetween(Date first,Date last){}} |
* *.*(..) o * * (..) | Cualquier método independientemente de su tipo, del tipo de retorno, de su nombre y de los argumentos que espere | Cualquier método del sistema |
!public * User.*(..) | Cualquier método que no sea público (privado,protegido o paquete) | class User {protected getUserInfo(){}} |
* * (..) throws Recognition Exception | Cualquier método que declare que puede lanzar una excepción de tipoRecognitionException | class AntlRBasedParser { public void parser(String file) throws RecognitionException} |
* User+.*(..) | Cualquier método en la clase User y sus subclases | class UserDetails extends User {} |
User UserService.*(..) | Cualquier método del tipo UserService cuyo tipo de retorno sea User. Si alguna de las subclases sobrescribe el tipo de retorno con un subtipo de User (mediante el tipo de retorno covariante introducido en Java 5) también será seleccionado. | class UserService{public User retrieveUser(String name){}} class DetailUserService extends UserService{public DetailedUser retrieveUser(String name){}} |
La signatura en el caso de los constructores difiere de la signatura de métodos en los siguientes aspectos:
- Los constructores no tienen tipo de retorno por lo que no se permite utilizar el valor de retorno en la especificación de un pointcut de este tipo.
- Dado que los nombres de los constructores no pueden ser libres (tienen que utilizar el mismo nombre de la clase), la parte de la signatura destinada al nombre será sustituida con la palabra new.
- Por último, puesto que los constructores no pueden ser estáticos, no se podrá utilizar la palabra reservada static
- Signaturas de campos
Patrón de la signatura | Descripción | Ejemplos de campos concordantes |
---|---|---|
private String User.username | Campo privado (tanto campo de una instancia como estático) de la clase User | class User { private String username;} |
* User.* | Cualquier campo de la clase User independiente de sus calificadores, tipo y nombre. | class User{private String username;protected int credits;private UserDetails details;} |
* User+.* | Cualquier campo de la clase User y todas sus subclases, independientemente de sus calificadores, tipo y nombre. | El ejemplo de la fila anterior o class SpecificUser extends User {private String address;} |