1. 程式人生 > >@Resource註解和@Autowired註解的區別

@Resource註解和@Autowired註解的區別

@Resource註解(javax.annotation.Resource;)由sun公司開發而成;@Resource註解預設按照輸入的名稱進行bean裝配

@Autowired註解(org.springframework.beans.factory.annotation.Autowired)是spring的註解;@Autowired註解預設按照型別方式進行bean裝配

Spring屬於第三方的,J2EE是Java自己的東西。

現在我們有一個StudentDao介面:

public interface StudentDao {
	public void add();
	public void find();
}

另外加入兩個實現類:

@Repository//被spring託管
public class StudentRedisDaoImpl implements StudentDao{

	@Override
	public void add() {
		System.out.println("redis中的新增完成");
	}

	@Override
	public void find() {
		System.out.println("redis中的查詢完成");
	}

}
@Repository	//<bean id="studentDaoImpl" class="../">
public class studentDaoImpl implements StudentDao{

	@Override
	public void add() {
		System.out.println("訪問資料庫,完成新增功能");
	}

	@Override
	public void find() {
		System.out.println("訪問資料庫,完成查詢功能");
	}

}

主調類:

@Service
public class StudentBizImpl implements StudentBiz{
//	private StudentDao dao = new studentDaoImpl();
	//缺點:1 StudentBizImpl是直接依賴於studentDaoImpl
	//根據型別注入的!!!!!!!!!!!!
	@Autowired  //<property name="studentDao" ref="studentDaoImpl"> 完成自動裝配的工作, 通過 @Autowired的使用來消除 set ,get方法
	private StudentDao studentDao ;//StudentDao介面
	@Override
	public void add() {
		studentDao.add();
	}

	@Override
	public void find() {
		studentDao.find();
	}

	public void setStudentDao(StudentDao dao) {
		this.studentDao = dao;
		System.out.println("spring呼叫set方法完成注入studentDao物件");
	}

	
}

如果我們這樣執行,會丟擲異常:


    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:88)
    at com.syy.springtest.testAnnotation.AppTest.testHello4(AppTest.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.syy.dao.StudentDao' available: expected single matching bean but found 2: studentRedisDaoImpl,studentDaoImpl
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:215)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:584)
    ... 37 more

意思是在裝配bean時,發現了兩個相同的實現類,都implementsStudentDao, 因此不知道選擇哪一個,丟擲異常。

這時,我們需要再加一個註解@Qualifier("studentRedisDaoImpl") ,這樣就只針對studentRedisDaoImpl 這個類

但如果用@Resource註解,我們會發現方便了許多,@Resource(name="studentRedisDaoImpl") 就可以實現@Resource注入,並且使用@Resource可以減少程式碼和Spring之間的耦合。
 

相關推薦

@Resource註解@Autowired註解區別

@Resource註解(javax.annotation.Resource;)由sun公司開發而成;@Resource註解預設按照輸入的名稱進行bean裝配 @Autowired註解(org.springframework.beans.factory.annotation.

spring中自動註解配置以及@Resource@Autowired區別

1.spring中自動註解需要配置標籤<context:component-scan> 配置完這個標籤後,spring就會去自動掃描base-package對應的路徑或者該路徑的子包下面的java檔案,如果掃描到檔案中帶有@Service,@Com

Spring5:@Autowired註解、@Resource註解@Service註解

什麼是註解 傳統的Spring做法是使用.xml檔案來對bean進行注入或者是配置aop、事物,這麼做有兩個缺點: 1、如果所有的內容都配置在.xml檔案中,那麼.xml檔案將會十分龐大;如果按需求分開.xml檔案,那麼.xml檔案又會非常多。總之這將導致配置檔案的可讀性

Spring @Autowired註解、@Resource註解@Service註解

  什麼是註解 傳統的Spring做法是使用.xml檔案來對bean進行注入或者是配置aop、事物,這麼做有兩個缺點: 1、如果所有的內容都配置在.xml檔案中,那麼.xml檔案將會十分龐大;如果按需求分開.xml檔案,那麼.xml檔案又會非常多。總之這將導致配置檔案的可讀性與

Spring(七)用@Resource@Autowired註解完成屬性裝配及自動裝配

使用到註解需匯入jar包:common-annotations.jar 手工裝配依賴物件有兩種程式設計方式: 一、在xml配置檔案中通過bean節點進行配置,如: <?xml version="1.0" encoding="UTF-8"?>

Spring的@Autowired註解、@Resource註解@Service註解

什麼是註解 傳統的Spring做法是使用.xml檔案來對bean進行注入或者是配置aop、事物,這麼做有兩個缺點: 1、如果所有的內容都配置在.xml檔案中,那麼.xml檔案將會十分龐大;如果按需求分開.xml檔案,那麼.xml檔案又會非常多。總之這將導致配置檔案的可讀性與可維護性變得很低 2、在開發中在.

Spring框架註解:@Autowired註解、@Resource註解@Service註解

什麼是註解傳統的Spring做法是使用.xml檔案來對bean進行注入或者是配置aop、事物,這麼做有兩個缺點:1、如果所有的內容都配置在.xml檔案中,那麼.xml檔案將會十分龐大;如果按需求分開.xml檔案,那麼.xml檔案又會非常多。總之這將導致配置檔案的可讀性與可維護

@Component註解@Configuration註解的之間的區別

直白的說Component包含了Configuration的所用註解:Configuration和Component都是註解在類上的,Configuration類中的方法成員變數是@Value註解,方法上的註解是@BeanComponent類中的方法和成員變數沒有任何限制

@RestController註解@Controller註解區別

在學習的過程中發現這個問題,寫篇部落格記錄一下,方便以後查閱。 @RestController註解是@Controller和@ResponseBody註解的結合。 首先說明: @Controller註解表明這是一個控制器類 在方法上加註解@ResquestMapping(v

詳細解析@Resource@Autowired區別 , 以及@Qualifier的作用

首先 . @Resource是javax.annotation 包中的註解類 , 是jdk中封裝的 . @AutoWired是spring的中註解,依賴於spring上下文. 相同點: @Resource 和 @Autowired 都可以用在類中的fi

ssh2項目整合 struts2.1+hibernate3.3+spring3 基於hibernate註解struts2註解

模塊 port aware -- ids tle des 項目 @service 項目文件夾結構例如以下: 核心配置文件: web.xml <?xml version="1.0" encoding="UTF-8"

組合註解註解

從 spring 2.0 開始為了響應 jdk1.5推出的註解功能, spring 開始大量加入註解來替代xml 配置. 元註解:即可註解到其他註解的註解. 組合註解:即被註解的註解. 示例: 組合註解: package com.pangu.annotation; impo

Spring Boot 2 @EnableWebMvc 註解@EnableSpringDataWebSupport 註解使用說明

1. @EnableWebMvc使用說明 @EnableWebMvc 只能新增到一個@Configuration配置類上,用於匯入Spring Web MVC configuration 可以有多個@Configuration類來實現WebMvcConfigurer,以定製

springmvc.xml(註解註解的詳細配置)

註解和非註解的一些配置說明,方便自己以後檢視! 非註解如下: <!--非註解開始 --> <!--非註解的處理器介面卡 --> <!-- 處理器介面卡的配置 所有的處理器介面卡都需要實現HandlerAdapter介面 -->

SSH整合步驟之註解註解

加入jar struts rep imp dialect 整合struts com ssp rda spring整合hibernate 加入jar包 加入spring和aop所需必須包 加入hibernate的必須包 spring整合hibernate的必須包 org.sp

SpringBoot+MyBatis中自動根據@Table註解@Column註解生成ResultMap

while ash 標記 ast protoc 第一個 ann element conf 其實我一點都不想用mybatis,好多地方得自己寫,比如這裏。 使用mybatis要寫大量的xml,煩的一批。最煩人的莫過於寫各種resultmap,就是數據庫字段和實體屬性做映射。

教你如何建立註解淺析註解原理

前言: 註解在目前而言最主流的應用:代替配置檔案 關於配置檔案與註解開發的優缺點: 註解優點:開發效率高 成本低  註解缺點:耦合性大 並且不利於後期維護 常見的註解舉例: @Override:告知編譯器此方法是覆蓋父類的 @Deprecated:標註過時 @

@ResponseBody註解@RequestBody註解

在Spring中使用@ResponseBody註解可以將方法返回的物件序列化成JSON, 將返回的物件轉成json字串返回, 與下面的@ResponseBody註解功能相反. 在Controll

SpringMvc 上傳excel(註解註解兩種方式)

1、第一種方式: A:JSP頁面: <form name="importForm" action="${ctx }/service/userService/BatchImport.do" method="post" enctype="multipar

Spring中的@Controller註解@RestController註解的相同點不同點

相同點: 1:@Controller和@RestController兩個註解的生命週期都會持續到程式執行時; 2:@Controller和@RestController都用來表示當前類是一個控制器servlet 不同點: 1:@RestController是@Control