@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