您的位置:首页 > 编程语言 > Java开发

spring 不同注解的使用场景

2016-04-19 17:10 573 查看
spring中各种注解的使用场景。本文摘自stackoverflow.url:http://stackoverflow.com/questions/19414734/understanding-spring-autowired-usage

The 
@Autowired
 annotation
allows you to skip configurations elsewhere of what to inject and just does it for you. Assuming your package is 
com.mycompany.movies
 you
have to put this tag in your XML (application context file):
<context:component-scan base-package="com.mycompany.movies" />


This tag will do an auto-scanning. Assuming each class that has to become a bean is annotated with a correct annotation like 
@Component
 (for
simple bean) or 
@Controller
 (for
a servlet control) or 
@Repository
 (for 
DAO
 classes)
and these classes are somewhere under the package 
com.mycompany.movies
,
Spring will find all of these and create a bean for each one. This is done in 2 scans of the classes - the first time it just searches for classes that need to become a bean and maps the injections it needs to be doing, and on the second scan it injects the
beans. Of course, you can define your beans in the more traditional XML file or with a @Configuration class
(or any combination of the three).

The 
@Autowired
 annotation
tells Spring where an injection needs to occur. If you put it on a method 
setMovieFinder
 it
understands (by the prefix 
set
 +
the 
@Autowired
 annotation)
that a bean needs to be injected. In the second scan, Spring searches for a bean of type 
MovieFinder
,
and if it finds such bean, it inject  

it to this method. If it finds two such beans you will get an 
Exception
.
To avoid the 
Exception
,
you can use the 
@Qualifier
 annotation
and tell it which of the two beans to inject in the following manner:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}

@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}


Or if you prefer to declare the beans in your XML, it would look something like this:
<bean id="redBean" class="com.mycompany.movies.Red"/>

<bean id="blueBean" class="com.mycompany.movies.Blue"/>


In the 
@Autowired
 declaration,
you need to also add the 
@Qualifier
 to
tell which of the two color beans to inject:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}


If you don't want to use two annotations (the 
@Autowired
 and 
@Qualifier
)
you can use 
@Resource
to
combine these two:
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}


The 
@Resource
 (you
can read some extra data about it in the first comment on this answer) spares you the use of two annotations and instead you only use one.

I'll just add two more comments:
Good practice would be to use 
@Inject
 instead
of 
@Autowired
 because
it is not Spring-specific and is part of the 
JSR-330
 standard
.
Another good practice would be to put the 
@Inject
 / 
@Autowired
 on
a constructor instead of a method. If you put it on a constructor, you can validate that the injected beans are not null and fail fast when you try to start the application and avoid a 
NullPointerException
 when
you need to actually use the bean.

So, to sum it up: The 
@Autowired
 annotation
spares you the need to do the wiring by yourself in the XML file (or any other way) and just finds for you what needs to be injected where, and does that for you.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring