参考官网
The @Repository
annotation is a marker for any class that fulfills the role or stereotype (also known as Data Access Object or DAO) of a repository. Among the uses of this marker is the automatic translation of exceptions as described in Section 15.2.2, “Exception translation”.
Spring provides further stereotype annotations: @Component
, @Service
, and @Controller
. @Component
is a generic stereotype for any Spring-managed component.@Repository
, @Service
, and @Controller
are specializations of @Component
for more specific use cases, for example, in the persistence, service, and presentation layers, respectively. Therefore, you can annotate your component classes with @Component
, but by annotating them with @Repository
, @Service
, or @Controller
instead, your classes are more properly suited for processing by tools or associating with aspects. For example, these stereotype annotations make ideal targets for pointcuts. It is also possible that @Repository
, @Service
, and @Controller
may carry additional semantics in future releases of the Spring Framework. Thus, if you are choosing between using @Component
or @Service
for your service layer, @Service
is clearly the better choice. Similarly, as stated above, @Repository
is already supported as a marker for automatic exception translation in your persistence layer.
5.10.2 Meta-annotations
Many of the annotations provided by Spring can be used as "meta-annotations" in your own code. A meta-annotation is simply an annotation, that can be applied to another annotation. For example, The @Service
annotation mentioned above is meta-annotated with with @Component
:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component // Spring will see this and treat @Service in the same way as @Component public @interface Service { // .... }
Meta-annotations can also be combined together to create composed annotations. For example, the @RestController
annotation from Spring MVC is composed of@Controller
and @ResponseBody
.
With the exception of value()
, meta-annotated types may redeclare attributes from the source annotation to allow user customization. This can be particularly useful when you want to only expose a subset of the source annotation attributes. For example, here is a custom @Scope
annotation that defines session
scope, but still allows customization of the proxyMode
.
Demo参考
Bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config />
<context:component-scan base-package="com"/>
<!-- <bean id="userDAO" class="com.dao.impl.UserDaoImpl">
</bean>
<<bean id="user2" class="com.dao.impl.UserDaoImpl">
</bean>
<bean id="userService" class="com.service.UserService">
</bean> -->
</beans>
DaoImpl
package com.dao.impl;
import org.springframework.stereotype.Component;
import com.dao.UserDAO;
import com.model.User;
@Component("userDao_Componet")
public class UserDaoImpl implements UserDAO{
@Override
public void saveMySql(User user) {
System.out.println("Mysql: " + user.getUsername());
}
@Override
public void saveOracle(User user) {
System.out.println("Oracle: " + user.getPassword());
}
}
Service
package com.service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.dao.UserDAO;
import com.model.User;
@Component("userService_Componet")
public class UserService {
private UserDAO userDAO;
public void add(User user) {
userDAO.saveMySql(user);
}
public UserDAO getUserDAO() {
return userDAO;
}
/**
* @Resource 默认使用userDAO(前提只有一个bean)
* @Resource(name = "user2")
* @param userDAO
*/
/*@Resource*/
@Resource(name = "userDao_Componet")
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
testservice
package com.service;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.model.User;
/**
* Dao主要做数据库的交互工作
* Modle 是模型 存放你的实体类
*Service 做相应的业务逻辑处理
*Action是一个控制器
* @author tao.zeng
*
*/
public class UserServiceTest {
@Test
public void testAdd() throws Exception {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
UserService service = (UserService)ctx.getBean("userService_Componet");
User u = new User();
u.setUsername("syw");
u.setPassword("syw");
service.add(u);
}
}