Core Spring Annotation
SR
|
Annotation
|
Use
|
Explanation
|
1
|
@Autowired
|
Constructor, Field,
Method
|
Declares a constructor, field, setter
method, or configuration method
to be autowired by type. Items
annotated with @Autowired do not
have to be public.
|
2
|
@Configurable
|
Type
|
Used with <context:springconfigured>
to declare types whose
properties should be injected, even
if they are not instantiated by Spring.
Typically used to inject the properties
of domain objects.
|
3
|
@Order
|
Type, Method, Field
|
Defines ordering, as an alternative
to implementing the org.
springframework.core.Ordered
interface.
|
4
|
@Qualifier
|
Field, Parameter, Type,
Annotation Type
|
Guides autowiring to be performed by
means other than by type.
|
5
|
@Required
|
Method (setters)
|
Specifies that a particular property
must be injected or else the
configuration will fail.
|
6
|
@Scope
|
Type
|
Specifies the scope of a bean, either
singleton, prototype, request, session,
or some custom scope.
|
Stereotyping Annotations
These annotations are used to stereotype classes with regard to the application tier that they belong to. Classes that are annotated with one of these annotations will automatically be registered in the Spring application context if <context:component-scan> is in the Spring XML configuration. In addition, if a PersistenceExceptionTranslationPostProcessor is configured in Spring, any bean annotated with @Repository will have SQLExceptions thrown from its methods translated into one of Spring’s unchecked DataAccessExceptions.
SR
|
Annotaion
|
Use
|
Explanation
|
1
|
@Component
|
Type
|
Generic stereotype annotation for any Spring-managed
component.
|
2
|
@Controller
|
Type
|
Stereotypes a component as a Spring MVC controller.
|
3
|
@Repository
|
Type
|
Stereotypes a component as a repository. Also indicates that SQLExceptions thrown from the
component’s methods should be translated into Spring
DataAccessExceptions.
|
4
|
@Service
|
Type
|
Stereotypes a component as a service.
|
Spring MVC Annotations
These annotations were introduced in Spring 2.5 to make it easier to create Spring MVC applications with minimal XML configuration and without extending one of the many implementations of the Controller interface.
SR
|
Annotaion
|
Use
|
Explanation
|
1
|
@Controller
|
Type
|
Stereotypes a component as a Spring
MVC controller.
|
2
|
@InitBinder
|
Method
|
Annotates a method that customizes
data binding.
|
3
|
@ModelAttribute
|
Parameter,
Method
|
When applied to a method, used
to preload the model with the value
returned from the method. When applied to a parameter, binds a model attribute to the parameter .
|
4
|
@RequestMapping
|
Method, Type
|
Maps a URL pattern and/or HTTP method to a method or controller type.
|
5
|
@RequestParam
|
Parameter
|
Binds a request parameter to a method parameter.
|
6
|
@SessionAttributes
|
Type
|
Specifies that a model attribute should be stored in the session.
|
Transaction Annotations
The @Transactional annotation is used along with the <tx:annotation-driven> element to declare transactional boundaries and rules as class and method metadata in Java.
SR
|
Annotaion
|
Use
|
Explanation
|
1
|
@Transactional
|
Method,Type
|
Declares transactional boundaries and rules on a bean and/or its methods.
|
The <tx:annotation-driven> element tells Spring to keep an eye out for beans that are annotated with @Transactional. In addition,you’ll also need a platform transaction manager bean declared in the Spring context. For example, if your application uses Hibernate, you’ll want to include the HibernateTransactionManager:
<bean id=”transactionManager”
class=”org.springframework.orm.hibernate3.
HibernateTransactionManager”>
<property name=”sessionFactory” ref=”sessionFactory”
/> </bean>
With the basic plumbing in place, you’re ready to start annotating the transactional boundaries:
@Transactional(propagation=Propagation.SUPPORTS,
readOnly=true)
public class TreasureRepositoryImpl implements
TreasureRepository {
…
@Transactional(propagation=Propagation.REQUIRED,
readOnly=false)
public void storeTreasure(Treasure treasure) { …}
…
}
At the class level, @Transactional is declaring that all methods should support transactions and be read-only. But, at the method-level, @Transactional declares that the storeTreasure() method requires a transaction and is not read-only.
Note that for transactions to be applied to @Transactionalannotated
classes, those classes must be wired as beans in Spring.
JMX Annotations
These annotations, used with the <context:mbean-export> element, declare bean methods and properties as MBe operations and attributes.
SR
|
Annotaion
|
Use
|
Explanation
|
1
|
@ManagedAttribute
|
Method
|
Used on a setter or getter method
to indicate that the bean’s property
should be exposed as a MBean
attribute.
|
2
|
@ManagedNotification
|
Type
|
Indicates a JMX notification emitted
by a bean.
|
3
|
@ManagedNotifications
|
Type
|
Indicates the JMX notifications
emitted by a bean.
|
4
|
@ManagedOperation
|
Method
|
Specifies that a method should be
exposed as a MBean operation.
|
5
|
@ManagedOperationParameter
|
Method
|
Used to provide a description for an
operation parameter.
|
6
|
@ManagedOperationParameters
|
Method
|
Provides descriptions for one or
more operation parameters.
|
7
|
@ManagedResource
|
Type
|
Specifies that all instances of a class
should be exposed a MBeans.
|
Exposing a Spring Bean as a MBean To get started with Spring-annotated MBeans, you’ll need to include <context:mbean-export> in the Spring XML configuration:
<context:mbean-export/>
Then, you can annotate any of your Spring-managed beans to be exported as MBeans:
@ManagedResource(objectName="pirates:name=PirateService")
public interface PirateService {
@ManagedOperation(
description="Get the pirate list")
public List<Pirate> getPirateList();
}
Here, the PirateService has been annotated to be exported as a
MBean and its getPirateList() method is a managed operation.
Aspectj Annotations
SR
|
Annotaion
|
Use
|
Explanation
|
1
|
@Aspect
|
Type
|
Declares a class to be an aspect.
|
2
|
@After
|
Method
|
Declares a method to be called after a
pointcut completes.
|
3
|
@AfterReturning
|
Method
|
Declares a method to be called after a
pointcut returns successfully.
|
4
|
@AfterThrowing
|
Method
|
Declares a method to be called after a
pointcut throws an exception.
|
5
|
@Around
|
Method
|
Declares a method that will wrap the
pointcut.
|
6
|
@Before
|
Method
|
Declares a method to be called before
proceeding to the pointcut.
|
7
|
@DeclareParents
|
Static Field
|
Declares that matching types should be given new parents—that is, it introduces new functionality into matching types.
|
8
|
@Pointcut
|
Method
|
Declares an empty method as a pointcut placeholder method.
|
What’s important to note, however, is that while you can use AspectJ annotations to define Spring aspects, those aspects will be defined in the context of Spring AOP and will not be handled by the AspectJ runtime. This is significant because Spring AOP is limited to proxying method invocations and does not provide for the more exotic pointcuts (constructor interception, fieldinterception, etc.) offered by AspectJ.
Annotating Aspects
To use AspectJ annotations to create Spring aspects, you’ll first need to provide a bit of Spring XML plumbing:
<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-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/springaop-
2.5.xsd">
…
<aop:aspectj-autoproxy/>
…
</beans>
The <aop:aspectj-autoproxy> element tells Spring to watch for
beans annotated with AspectJ annotations and, if it finds any, to
use them to create aspects. Then you can annotate bean classes
to be aspects:
@Aspect
public class ChantySinger {
@Pointcut(“execution(* Pirate.plunder(..))”)
public void plunderPC() {}
@Before(“plunderPC()”)
public void singYoHo() {
…
}
@AfterReturning(“plunderPC()”)
public void singAPiratesLifeForMe() {
…
}
}
This simple annotation-based aspect has a pointcut that is triggered by the execution of a plunder() method on the Pirate class. Before the Pirate.plunder() method is executed, the singYoHo() method is called. Then, after the Pirate.plunder() method returns successfully, the singAPiratesLifeForMe()
JSR -250 Annotation
SR
|
Annotation
|
Use
|
Explanation
|
1
|
@PostConstruct
|
Method
|
Indicates a method to be invoked after a bean has been created and dependency injection is complete. Used to perform any initialization work necessary.
|
2
|
@PreDestroy
|
Method
|
Indicates a method to be invoked just
before a bean is removed from the Spring context. Used to perform any cleanup work necessary.
|
3
|
@Resource
|
@Resource
|
Indicates that a method or field should be injected with a named resource (by default, another bean).
|
Wiring Bean Properties with @Resource Using @Resource, you can wire a bean property by name:
public class Pirate {
@Resource
private TreasureMap treasureMap;
}
In this case, Spring will attempt to wire the “treasureMap” property with a reference to a bean whose ID is “treasureMap”. If you’d rather explicitly choose another bean to wire into the property, specify it to the name attribute:
public class Pirate {
@Resource(name=”mapToSkullIsland”)
private TreasureMap treasureMap;
}
Initialization and Destruction Methods Using JSR-250’s @PostConstruct and @PreDestroy methods,
you can declare methods that hook into a bean’s lifecycle. For example, consider the following methods added to the Pirate
class:
public class Pirate {
…
@PostConstruct
public void wakeUp() {
System.out.println(“Yo ho!”);
}
@PreDestroy
public void goAway() {
System.out.println(“Yar!”);
}
}
As annotated, the wakeUp() method will be invoked just after Spring instantiates the bean and goAway() will be invoked just before the bean is removed from the Spring container.
Testing Annotations
These annotations are useful for creating unit tests in the JUnit 4 style that depend on Spring beans and/or require a transactional context.
SR
|
Annotation
|
Use
|
Explanation
|
1
|
@AfterTransaction
|
Method
|
IUsed to identify a method to be invoked after a transaction has
completed.
|
2
|
@BeforeTransaction
|
Method
|
Used to identify a method to be
invoked before a transaction starts.
|
3
|
@ContextConfiguration
|
Type
|
Configures a Spring application
context for a test.
|
4
|
@DirtiesContext
|
Method
|
Indicates that a method dirties the Spring container and thus it must
be rebuilt after the test completes.
|
5
|
@IfProfileValue
|
Type,
Method
|
Indicates that the test class or method is enabled for a specific profile configuration.
|
6
|
@NotTransactional
|
Method
|
Indicates that a test method must
not execute in a transactional
context.
|
7
|
@ProfileValueSourceConfiguration
|
Type
|
Identifies an implementation of a
profile value source. The absence
of this annotation will cause profile
values to be loaded from system
properties.
|
8
|
@Repeat
|
Method
|
Indicates that the test method must
be repeated a specific number of
times.
|
9
|
@Rollback
|
Method
|
Specifies whether or not the transaction for the annotated
method should be rolled back
or not.
|
10
|
@TestExecutionListeners
|
Type
|
Identifies zero or more test execution listeners for a test class.
|
11
|
@Timed
|
Method
|
Specifies a time limit for the test
method. If the test does not complete before the time has expired, the test will fail.
|
12
|
@TransactionConfiguration
|
Type
|
Configures test classes for transactions, specifying the
transaction manager and/or the
default rollback rule for all test
methods in a test class.
|
Writing a Spring-Aware Test
The key to writing a Spring-aware test is to annotate the test class with @RunWith, specifying SpringJUnit4ClassRunner as the class runner behind the test:
@RunWith(SpringJUnit4ClassRunner.class)
public class PirateTest {
…
}
In this case, the Spring test runner will try to load a Spring application context from a file named PirateTest-context.xml. If you’d rather specify one or more XML files to load the application context from, you can do that with @ContextConfiguration:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "pirates.xml" })
public class PirateTest {
…
}
With test configured to load a Spring application context, you now may request that Spring autowire properties of the test class with beans from the Spring context:
Writing a Spring-Aware Test, continued
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "pirates.xml" })
public class PirateTest {
@Autowired
private Pirate pirate;
@Autowired
private TreasureMap treasureMap;
@Test
public void annotatedPropertyShouldBeAutowired() {
assertNotNull(pirate.getTreasureMap());
assertEquals(treasureMap, pirate.getTreasureMap());
}
}
In this case, the pirate and treasureMap properties will be wired with the beans whose ID are “pirate” and “treasureMap”, respectively. Accessing the Spring Context in a Test If you need the Spring application context itself in a test, you can autowire it into the test the same as if it were a bean in the context:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "pirates.xml" })
public class PirateTest {
@Autowired
private Pirate pirate;
@Autowired
private ApplicationContext applicationContext;
@Test
public void annotatedPropertyShouldBeAutowired() {
assertNotNull(pirate.getTreasureMap());
assertEquals(applicationContext.
getBean("treasureMap"), pirate
.getTreasureMap());
}
}
No comments:
Post a Comment