How to use Spring @Component, @Repository, @Service and @Controller Annotations?
来源:互联网 发布:西安白队长 知乎 编辑:程序博客网 时间:2024/04/27 23:40
In spring autowiring concepts, we learned about @Autowired
annotation that it handles only wiring. You still have to define the beans themselves so the container is aware of them and can inject them for you. But with @Component
, @Repository
, @Service
and @Controller
annotations in place and after enabling automatic component scanning, spring will automatically import the beans into the container so you don’t have to define them explicitly with XML. These annotations are called Stereotype annotations as well.
Before jumping to example use of these annotations, let’s learn quick facts about these annotations which will help you in making a better decision about when to use which annotation.
@Component, @Repository, @Service and @Controller annotations
1) The @Component
annotation marks a java class as a bean so the component-scanning mechanism of spring can pick it up and pull it into the application context. To use this annotation, apply it over class as below:
@Component
public
class
EmployeeDAOImpl
implements
EmployeeDAO {
...
}
2) Although above use of @Component
is good enough but you can use more suitable annotation that provides additional benefits specifically for DAOs i.e.@Repository
annotation. The @Repository
annotation is a specialization of the @Component
annotation with similar use and functionality. In addition to importing the DAOs into the DI container, it also makes the unchecked exceptions (thrown from DAO methods) eligible for translation into SpringDataAccessException
.
3) The @Service
annotation is also a specialization of the component annotation. It doesn’t currently provide any additional behavior over the @Component
annotation, but it’s a good idea to use @Service
over @Component
in service-layer classes because it specifies intent better. Additionally, tool support and additional behavior might rely on it in the future.
4) @Controller
annotation marks a class as a Spring Web MVC controller. It too is a @Component
specialization, so beans marked with it are automatically imported into the DI container. When you add the @Controller
annotation to a class, you can use another annotation i.e. @RequestMapping
; to map URLs to instance methods of a class.
@Component
annotation. Most of the time, you will using @Repository
, @Service
and@Controller
annotations. @Component
should be used when your class does not fall into either of three categories i.e. controller, manager and dao.If you want to define name of the bean with which they will be registered in DI container, you can pass the name in annotation itself e.g. @Service (“employeeManager”).
How to enable component scanning
Above four annotation will be scanned and configured only when they are scanned by DI container of spring framework. To enable this scanning, you will need to use “context:component-scan” tag in your applicationContext.xml
file. e.g.
<
context:component-scan
base-package
=
"com.howtodoinjava.demo.service"
/>
<
context:component-scan
base-package
=
"com.howtodoinjava.demo.dao"
/>
<
context:component-scan
base-package
=
"com.howtodoinjava.demo.controller"
/>
The context:component-scan element requires a base-package attribute, which, as its name suggests, specifies a starting point for a recursive component search. You may not want to give your top package for scanning to spring, so you should declare three component-scan elements, each with a base-package attribute pointing to a different package.
How to use @Component, @Repository, @Service and @Controller Annotations
As I already said that you use @Repository
, @Service
and @Controller
annotations over DAO, manager and controller classes. But in real life, at DAO and manager layer we often have separate classes and interfaces. Interface for defining the contract, and classes for defining the implementations of contracts. Where to use these annotations? Let’s find out.
Always use these annotations over concrete classes; not over interfaces.
Once you have these stereotype annotations on beans, you can directly use bean references defined inside concrete classes. Note the references are of type interfaces. Spring DI container is smart enough to inject the correct instance in this case.
EmployeeDAO.java and EmployeeDAOImpl.java
public
interface
EmployeeDAO
{
public
EmployeeDTO createNewEmployee();
}
@Repository
(
"employeeDao"
)
public
class
EmployeeDAOImpl
implements
EmployeeDAO
{
public
EmployeeDTO createNewEmployee()
{
EmployeeDTO e =
new
EmployeeDTO();
e.setId(
1
);
e.setFirstName(
"Lokesh"
);
e.setLastName(
"Gupta"
);
return
e;
}
}
EmployeeManager.java and EmployeeManagerImpl.java
public
interface
EmployeeManager
{
public
EmployeeDTO createNewEmployee();
}
@Service
(
"employeeManager"
)
public
class
EmployeeManagerImpl
implements
EmployeeManager
{
@Autowired
EmployeeDAO dao;
public
EmployeeDTO createNewEmployee()
{
return
dao.createNewEmployee();
}
}
EmployeeController.java
@Controller
(
"employeeController"
)
public
class
EmployeeController
{
@Autowired
EmployeeManager manager;
public
EmployeeDTO createNewEmployee()
{
return
manager.createNewEmployee();
}
}
EmployeeDTO.java
public
class
EmployeeDTO {
private
Integer id;
private
String firstName;
private
String lastName;
public
Integer getId() {
return
id;
}
public
void
setId(Integer id) {
this
.id = id;
}
public
String getFirstName() {
return
firstName;
}
public
void
setFirstName(String firstName) {
this
.firstName = firstName;
}
public
String getLastName() {
return
lastName;
}
public
void
setLastName(String lastName) {
this
.lastName = lastName;
}
@Override
public
String toString() {
return
"Employee [id="
+ id +
", firstName="
+ firstName
+
", lastName="
+ lastName +
"]"
;
}
}
Let’s test the above configuration and annotations:
TestSpringContext.java
import
org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
import
com.howtodoinjava.demo.service.EmployeeManager;
public
class
TestSpringContext
{
public
static
void
main(String[] args)
{
ApplicationContext context =
new
ClassPathXmlApplicationContext(
"applicationContext.xml"
);
//EmployeeManager manager = (EmployeeManager) context.getBean(EmployeeManager.class);
//OR this will also work
EmployeeController controller = (EmployeeController) context.getBean(
"employeeController"
);
System.out.println(controller.createNewEmployee());
}
}
Output:
Jan
22
,
2015
6
:
17
:
57
PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext
@1b2b2f7f
:
startup date [Thu Jan
22
18
:
17
:
57
IST
2015
]; root of context hierarchy
Jan
22
,
2015
6
:
17
:
57
PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from
class
path resource [applicationContext.xml]
Employee [id=
1
, firstName=Lokesh, lastName=Gupta]
Drop me a comment/query if something needs more explanation.
Happy Learning !!
- How to use Spring @Component, @Repository, @Service and @Controller Annotations?
- Spring @Component, @Repository, @Service and @Controller Annotations
- Spring @Component、@Repository、@Service、@Controller
- Spring的标注@Component,@Service,@Controller,@Repository
- Spring注解@Component、@Repository、@Service、@Controller区别
- Spring总结-----@Component,@Service,@Controller,@Repository
- Spring注解@Component、@Repository、@Service、@Controller区别
- Spring 注解@Component,@Service,@Controller,@Repository
- Spring 注解@Component,@Service,@Controller,@Repository
- Spring注解@Component、@Repository、@Service、@Controller区别
- Spring注解@Component、@Repository、@Service、@Controller区别
- Spring注解@Component、@Repository、@Service、@Controller区别
- Spring注解@Component、@Repository、@Service、@Controller区别
- Spring注解@Component、@Repository、@Service、@Controller
- Spring总结-----@Component,@Service,@Controller,@Repository
- Spring注解@Component、@Repository、@Service、@Controller
- Spring注解@Component、@Repository、@Service、@Controller区别
- Spring注解@Component、@Repository、@Service、@Controller区别
- 一对一外键关联关系的理解与实践
- ubuntu设置minicom
- 千里之行,始于足下(二)-------创建基类
- C语言宏与单井号(#)和双井号(##)
- 浅谈英雄联盟之比尔吉沃特事件-一个游戏的生存方式
- How to use Spring @Component, @Repository, @Service and @Controller Annotations?
- 多源最短路
- EasyUI 的常用方法
- vim常用插件及安装
- [Objective-c]_[NSUserDefaults]_[基本使用]
- 背景建模(前景检测)算法入门 下篇
- 利用aapt查看APK版本号,包名,固件版本号
- Java总结篇系列:Java多线程(一)
- video.js的应用