首页 > 其他分享 >Spring中什么时候用@Resource,@service,及Spring注解@Component、@Repository、@Service、@Control...

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

时间:2023-06-27 17:32:40浏览次数:53  
标签:Control ... Resource Autowired Spring bean public 注入


参考资料

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。

 

标签:Control,...,Resource,Autowired,Spring,bean,public,注入
From: https://blog.51cto.com/nethub/6564685

相关文章

  • 使用Spring Boot快速构建应用
    随着Spring4新版本的发布,SpringBoot这个新的子项目得到了广泛的关注,因为不管是Spring4官方发布的新闻稿还是针对首席架构师AdrianColyer的专访,都对这个子项目所带来的生产率提升赞誉有加。 SpringBoot充分利用了JavaConfig的配置模式以及“约定优于配置”的理念,能够极大的简......
  • SpringMVC 史上最全最强详细示例实战教程
    一个简单的入门实例教程该实例的源码和实例中的jar源码所需要的jar 另外一篇关于SpringMVC文件上传,多文件上传 简单注解配置的实例: 一、创建项目:1、建立新的动态web项目:2、为项目命名为:SpringMVC_013、添加tomcat运行时环境\依赖库 如果是MyEclipse的话创建web项目时就不需要......
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Secureboot
    regaddHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Secureboot/vAvailableUpdates/tREG_DWORD/d0x10/f命令是用于在注册表中添加一个名为"AvailableUpdates"的DWORD值,并将其设置为十六进制值"0x10"。此操作需要管理员权限才能执行。这个命令的作用是向......
  • springmvc.xml
    <?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springfra......
  • 豆瓣评分 8.6,近 5 万读者学习的 Android 经典最新版出版,承载无数程序员的回忆......
    题图|新的小绿人 ©Google“出色向导”对新手来说,学习Android开发一开始会很难。就像初次踏入异国他乡一样,即使会说当地语言,一开始也绝不会有舒服自在的感觉。周围人习以为常的东西你不能理解,原有的知识储备在新环境下也完全派不上用场。Android有自己的语言文化——使用K......
  • springboot 通过SchedulingConfigurer实现多定时任务注册及动态修改执行周期
    Spring中定时任务有两种实现方式:1.@Scheduled(cron表达式)2.基于SchedulingConfigurer注册定时任务这两者的区别主要有1.@Scheduled不支持动态修改定时周期,只能停止服务器,修改cron表达式,再启动服务器;SchedulingConfigurer可以动态修改2.@Scheduled只能是单线程,而SchedulingConfi......
  • Spring面向切面编程(AOP)
    在软件开发中,我们经常需要解决一些与业务逻辑无关的横切关注点(cross-cuttingconcerns),例如日志记录、性能监测、事务管理等。传统的面向对象编程方法往往将这些关注点与核心业务逻辑混杂在一起,导致代码的可维护性和可扩展性下降。为了解决这个问题,Spring框架引入了面向切面编程(AOP......
  • 院士口中的“现代人知识结构”,学者推崇的“效率公民必备”,统计思维到底有什么了不起?..
    0要问现代人最难逃离哪种数学,概率与统计必须拥有姓名。“学者不能离开统计而究学,实业家不能离开统计而执业,政治家不能离开统计而施政。”统计应用之广,横跨文理,纵贯研究与实践。人们不断谈论“根据数据进行决策”“通过数据阐明情况”“观察数据得出结论”……其中的“数据”常常就......
  • 【Springboot】- 指定端口和配置文件
    Springboot服务jar的外部指定端口和文件方式springboot指定端口的三种方式第一配置文件中添加server.port=9090第二在命令行中指定启动端口,比如传入参数java-jarbootsample.jar--server.port=9000第三传入虚拟机系统属性java-Dserver.port=9000-jarbootsample.j......
  • java springboot3 Property 'sqlSessionFactory' or 'sqlSessionTemplate' are requir
    老版本的mybatis-plus未适配springboot3解决办法:在pom.xml修改 mybatis-plus-boot-starter版本<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><vers......