Spring中什么时候用@Resource,@service,及Spring注解@Component、@Repository、@Service、@Control

参考资料

http://blog.csdn.net/zhang854429783/article/details/6785574

http://crabboy.iteye.com/blog/339840

文章正文

<context:annotation-config/>  

<context:component-scan base-package=”com.eric.spring”>  

component-scan标签默认情况下自动扫描指定路径下的包(含所有子包),

将带有@Component、@Repository、@Service、@Controller标签的类自动注册到spring容器。

对标记了     Spring's @Required、@Autowired、

 JSR250's @PostConstruct、@PreDestroy、@Resource、

 JAX-WS's @WebServiceRef、

     EJB3's @EJB、

       JPA's @PersistenceContext、@PersistenceUnit

等注解的类进行对应的操作使注解生效(包含了annotation-config标签的作用)

 ==========================================================================

@Service

public class MyService {

@Autowired                  //https://www.tianmaying.com/tutorial/spring-boot-overview

JdbcTemplate jdbcTemplate;

}

@Repository

public class UserDao {

@Resource

private JdbcTemplate jdbcTemplate;

public void save(final User user){

 jdbcTemplate.execute(new ConnectionCallback() {

 @Override

 public Object doInConnection(Connection conn) throws SQLException,DataAccessException {

String sql="insert into t_user(name,age) values(?,?)";

PreparedStatement ps=conn.prepareStatement(sql);

ps.setString(1, user.getName());

ps.setInt(2, user.getAge());

ps.execute();

ps.close();

return null;

  }

});

}

<context:property-placeholder location="classpath:cn/spring/jdbc/jdbc.properties"/>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

<property name="jdbcUrl" value="${jdbcUrl}"></property>

<property name="driverClass" value="${driverClass}"></property>

<property name="user" value="${username}"></property>

<property name="password" value="${password}"></property>

<!-- 一些管理的配置 -->

<property name="initialPoolSize" value="3"></property>

<property name="maxPoolSize" value="15"></property>

<property name="minPoolSize" value="5"></property>

<property name="acquireIncrement" value="3"></property>

<property name="maxIdleTime" value="1800"></property>

</bean>

<!-- 配置jdbcTemplate -->

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

<property name="dataSource" ref="dataSource"></property>

</bean>

 ==========================================================================

MainTest类(Junit)package cn.spring.jdbc;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {

private ApplicationContext ac=new        ClassPathXmlApplicationContext("applicationContext.xml",getClass());

private UserDao userDao=(UserDao) ac.getBean("userDao");

@Test

public void testSave(){

User user=new User();

user.setName("阿范德萨");

user.setAge(24);

userDao.save(user);

}

}

==========================================================================

Spring中什么时候用@Resource,什么时候用@service

当你需要定义某个类为一个bean,则在这个类的类名前一行使用@Service("XXX"),就相当于讲这个类定义为一个bean,bean名称为XXX;

当需要在某个类中定义一个属性,并且该属性是一个已存在的bean,要为该属性赋值或注入时在该属性上一行使用@Resource(name="xxx"),相当于为该属性注入一个名称为xxx的bean。

Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。

  @Resource的作用相当于@Autowired,

只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。

@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

  @Resource装配顺序

  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常

  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常

  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常

  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

==========================================================================

@Qualifier

在使用Spring框架中@Autowired标签时默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。

当找不到一个匹配的 Bean 时,Spring 容器将抛BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。

Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称,这样歧义就消除了,可以通过下面的方法解决异常。 @Qualifier("XXX") 中的 XX是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。

@Autowired 可以对成员变量、方法以及构造函数进行注释,

而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。

示例配合autowired使用:

@Autowired

@Qualifier("userServiceImpl")

publicI UserService userService;

==========================================================================

spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。

在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。

虽然目前这3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用上述注解对分层中的类进行注释。

@Service用于标注业务层组件

@Controller用于标注控制层组件(如struts中的action)

@Repository用于标注数据访问组件,即DAO组件

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

@Service  

public class VentorServiceImpl implements iVentorService {     

}  

@Repository  

public class VentorDaoImpl implements iVentorDao {   

}  

在一个稍大的项目中,如果组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。 

Spring2.5为我们引入了组件自动扫描机制,他在类路径下寻找标注了上述注解的类,并把这些类纳入进spring容器中管理。

它的作用和在xml文件中使用bean节点配置组件时一样的。要使用自动扫描机制,我们需要打开以下配置信息:

getBean的默认名称是类名(头字母小写),如果想自定义,可以@Service(“aaaaa”)这样来指定。

这种bean默认是“singleton”的,如果想改变,可以使用@Scope(“prototype”)来改变。

可以使用以下方式指定初始化方法和销毁方法

@PostConstruct  

public void init() {   }   

@PreDestroy  

public void destory() {   }   

注入方式:

把DAO实现类注入到action的service接口(注意不要是service的实现类)中,注入时不要new 这个注入的类,因为spring会自动注入,如果手动再new的话会出现错误,

然后属性加上@Autowired后不需要getter()和setter()方法,Spring也会自动注入。  

在接口前面标上@Autowired注释使得接口可以被容器注入,如:

@Autowired  

@Qualifier("chinese")  

private Man man;   

当接口存在两个实现类的时候必须使用@Qualifier指定注入哪个实现类,

否则可以省略,只写@Autowired。

猜你喜欢

转载自nethub2.iteye.com/blog/2331688
今日推荐