08-spring學習-annotation配置

利用annotation配置注入關系

為了更好的解釋此類存在的意義,下面通過一段習慣性的開發進行問題的描述,例如:

現在有一個IAdminService服務層,這個服務層要調用的是IAdminDAO和IRoleDAO兩個數據層操作,于是定義如下:

?

范例:定義數據層操作。

package com.Spring.Dao;public interface IAdminDAO {public boolean findLogin();}

package com.Spring.Dao;public interface IRoleDAO {public boolean findAll();
}

實現層:

package com.Spring.Dao.Imp;import com.Spring.Dao.IAdminDAO;public class AdminDAOImpl implements IAdminDAO {@Overridepublic boolean findLogin() {System.out.println("[IAdminDAO]public boolean findLogin()");return false;}
}

package com.Spring.Dao.Imp;import com.Spring.Dao.IRoleDAO;public class RoleDAOImpl implements IRoleDAO {@Overridepublic boolean findAll() {System.out.println("[IRoleDAO]public boolean findAll()");return false;}
}

最早的時候,這兩個數據層的類一定要編寫工廠類,單向現在不用編寫工廠類了。

下面直接在appllicationContext.XML文件里面定義。

    <bean id="adminDaoImpl" class="com.Spring.Dao.Imp.AdminDAOImpl"></bean><bean id="roleDaoImpl" class="com.Spring.Dao.Imp.RoleDAOImpl"></bean>

隨后所有的數據層都要交給業務層操作,那么下面定義業務層操作:

?

package com.Spring.Service;public interface IAdminService {public boolean login();
}

下面定義實現層:

package com.Spring.Service.Impl;import com.Spring.Dao.IAdminDAO;
import com.Spring.Dao.IRoleDAO;
import com.Spring.Service.IAdminService;public class IAdminServiceImpl implements IAdminService {private IAdminDAO adminDao;private IRoleDAO roleDao;//setter是給依賴注入關系使用的。public void setAdminDao(IAdminDAO adminDao) {this.adminDao = adminDao;}public void setRoleDao(IRoleDAO roleDao) {this.roleDao = roleDao;}@Overridepublic boolean login() {this.adminDao.findLogin();this.roleDao.findAll();return false;}    
}

定義applicationContext.xml文件,配置彼此關系。

    <bean id="adminDaoImpl" class="com.Spring.Dao.Imp.AdminDAOImpl"></bean><bean id="roleDaoImpl" class="com.Spring.Dao.Imp.RoleDAOImpl"></bean><bean id="adminServiceImpl" class="com.Spring.Service.Impl.IAdminServiceImpl"><property name="adminDao" ref="adminDaoImpl"></property><property name="roleDao" ref="roleDaoImpl"></property></bean>

代碼寫到此處,可以說最原始的操作完成了,所有的關系通過applicationContext.xml文件完成了,

package com.Spring.Demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.Spring.Service.IAdminService;
import com.Spring.Service.Impl.IAdminServiceImpl;public class TestAdmin {public static void main(String args[]){ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext2.xml");IAdminService ia=ctx.getBean("adminServiceImpl",IAdminServiceImpl.class);ia.login();}
}

執行結果:

此時最直觀感受是,避免了工廠類的編寫,的確節約了代碼,但是反過來,問題又出現了,如果一個項目存在幾百個DAO或Service。這種寫法太累了。

?

在Spring之中,可以利用annotation完全簡化以上操作。

范例:要增加新的命名空間。

在配置文件中勾選上context命名空間:

會發現配置代碼中多了以下代碼:

范例:設置annotation的支持包

    <context:annotation-config/><context:component-scan base-package="com.Spring"/>

表示在“com.Spring”下所有程序支持annotation的配置。而在spring里面,針對于組件的annotation的配置

只提供三個注解定義(這三個注解定義的作用都一樣,只是單詞不同):

  1. @Component:主要用于定義組件,一般用于DAO上使用。
  2. @Service:主要用于定義組件,一般用于Service上用。
  3. @Repository:主要用于定義組件,一般用于Action上使用。

范例:修改xxxDAOImpl類:

package com.Spring.Dao.Imp;
import org.springframework.stereotype.Component;
import com.Spring.Dao.IAdminDAO;@Component
public class AdminDAOImpl implements IAdminDAO {@Overridepublic boolean findLogin() {System.out.println("[IAdminDAO]public boolean findLogin()");return false;}
}

?和:

package com.Spring.Dao.Imp;import org.springframework.stereotype.Component;import com.Spring.Dao.IRoleDAO;
@Component
public class RoleDAOImpl implements IRoleDAO {@Overridepublic boolean findAll() {System.out.println("[IRoleDAO]public boolean findAll()");return false;} 
}

現在如果使用了注解定義組件,那么名稱默認情況下就是類名稱的結構形式:

比如:AdiminDAOImpl:則訪問組件的名稱就是“adminDaoImpl”。

?

范例:在service層上使用注解:

相比之前,這里的兩個adminDao和roleDao的setter方法取消掉了,并且之前配置里面與setter配合使用,將會把如下的實例化作用的<bean>配置也去掉了,

    <bean id="adminDaoImpl" class="com.Spring.Dao.Imp.AdminDAOImpl"></bean><bean id="roleDaoImpl" class="com.Spring.Dao.Imp.RoleDAOImpl"></bean><bean id="adminServiceImpl" class="com.Spring.Service.Impl.IAdminServiceImpl"><property name="adminDao" ref="adminDaoImpl"></property><property name="roleDao" ref="roleDaoImpl"></property></bean>

?

取而代之的是注解:@Resource,來代替上面的這兩個屬性,表示此為注入的資源

package com.Spring.Service.Impl;
import javax.annotation.Resource;import org.springframework.stereotype.Service;import com.Spring.Dao.IAdminDAO;
import com.Spring.Dao.IRoleDAO;
import com.Spring.Service.IAdminService;
@Service
public class IAdminServiceImpl implements IAdminService { @Resource  //表示此為注入的資源private IAdminDAO adminDao;@Resourceprivate IRoleDAO roleDao;@Overridepublic boolean login() {this.adminDao.findLogin();this.roleDao.findAll();return false;}    
}

此時AdminServiceImpl類的引用名稱是:IAdminServiceImpl。因此使用的使用,使用getBean操作里面的bean名稱也是這個,如下:

測試操作:

package com.Spring.Demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.Spring.Service.IAdminService;
import com.Spring.Service.Impl.IAdminServiceImpl;public class TestAdmin {public static void main(String args[]){ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext2.xml");IAdminService ia=ctx.getBean("IAdminServiceImpl",IAdminServiceImpl.class);ia.login();}
}

現在發現:利用annotation實現的注入操作,整個流程都是非常簡化的,以后開發都是此類模式進行。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539935.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539935.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539935.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JQuery 綁定select標簽的onchange事件

原文出處&#xff1a;http://blog.csdn.net/a5489888/article/details/20045175 使用jqm的change事件 <script src"jquery.min.js" type"text/javascript"></script> <script language"javascript" type"text/javascript&q…

Android 6.0 源代碼編譯實踐

前陣子去上海參加 Android 開發面試&#xff0c;被問及了 Android 的基本原理、常用組件背后的實現機制、設計模式等問題&#xff0c;我都回答地不好。面試時&#xff0c;老司機們常常問我對知識點“背后的實現代碼有沒有看&#xff1f;”。于是我就想著&#xff0c;回來要把 A…

php 鏈接遠程oracle,PHP連接遠程oracle輸出數據

遠程連接的連接字符串可以這樣寫oledbconnection 的連接字符串:providermsdaora;host192.168.1.1;data sourcemytest;user idsystem;passwordxxxprovider msdaora; 指明oledb 的提供者是oracle數據庫host 是遠程 oracle 數據庫所在服務器的ip地址&#xff0c;如果端口不是默認…

RNN介紹,較易懂

人類并不是每時每刻都從一片空白的大腦開始他們的思考。在你閱讀這篇文章時候&#xff0c;你都是基于自己已經擁有的對先前所見詞的理解來推斷當前詞的真實含義。我們不會將所有的東西都全部丟棄&#xff0c;然后用空白的大腦進行思考。我們的思想擁有持久性。 傳統的神經網絡并…

android虛擬機鼠標左鍵拖動會輸入C

不知道什么原因&#xff0c;突然出現這個情況&#xff0c;以為是虛擬機壞了。于是刪了&#xff0c;新建&#xff0c;問題還是存在。 問題原因&#xff1a; 后來發現&#xff0c;原來是今天開了有道詞典&#xff0c;又開啟了詞典的劃詞翻譯。 解決方法&#xff1a; 關閉劃詞翻譯…

php生成圖片水印,PHP生成圖片加文字及圖案水印辦法

工作中&#xff0c;各種語言都要會&#xff0c;但不是各種語言都記到腦子里&#xff0c;常常要查字典、查手冊、以及百度對于PHP生成圖片加文字及圖案水印這項技巧&#xff0c;好久沒有用&#xff0c;又有些生疏了&#xff0c;現在來溫故知新&#xff0c;加深記憶&#xff01;代…

易飛揚宣布完成100G CWDM4PSM4光模塊量產線建設

訊&#xff0c;易飛揚即日宣布量產兩款高性能的100G光模塊&#xff1a;100G QSFP28 CWDM4 和100G QSFP28 PSM4。兩種產品采用同一個技術平臺和生產平臺。本次建設投產的CWDM4/PSM4 車間為萬級無塵恒溫恒濕車間&#xff0c;面積2000平米&#xff0c;配置有3套全自動高精密WIRE B…

滑動切換activity

一、效果 手在屏幕上劃過一段距離&#xff0c;切換頁面。 二、原理 2.1手在屏幕上出發 onTouch事件 2.2在onTouch事件中完成滑動邏輯處理 2.2.1 判斷劃過的x軸距離&#xff0c;如果大于多少&#xff0c;則startActivtiy 2.2.2 判斷劃過的y軸距離&#xff0c;如果大于多少&a…

Redux的全家桶與最佳實踐

2019獨角獸企業重金招聘Python工程師標準>>> image.png Redux 的第一次代碼提交是在 2015 年 5 月底&#xff08;也就是一年多前的樣子&#xff09;&#xff0c;那個時候 React 的最佳實踐還不是明晰&#xff0c;作為一個 View 層&#xff0c;有人會用 backbone 甚至…

php二分查找算法時間復雜度,一個運用二分查找算法的程序的時間復雜度是什么...

一個運用二分查找算法的程序的時間復雜度是“對數級別”。二分查找是一種效率較高的查找方法&#xff0c;算法復雜度即是while循環的次數&#xff0c;時間復雜度可以表示“O(h)O(log2n)”。本教程操作環境&#xff1a;windows7系統、Dell G3電腦。一個運用二分查找算法的程序的…

Android MediaPlayer使用方法簡單介紹

1&#xff09;如何獲得MediaPlayer實例&#xff1a; 可以使用直接new的方式&#xff1a;MediaPlayer mp new MediaPlayer();也可以使用create的方式&#xff0c;如&#xff1a;MediaPlayer mp MediaPlayer.create(this, R.raw.test);//這時就不用調用setDataSource了* 需要在…

oracle基本的操作命令,oracle命令基本操作

--創建表空間create tablespace TBS_OTHERS datafile G:\APP\ORCL\ORADATA\ORCL\TBS_OTHERS01.dbf size 1000m;-- 創建用戶create user C##JHGL identified by jhgl default tablespace TBS_OTHERScreate user C##YJYJHGL identified by jhgl default tablespace TBS_OTHERScre…

將不確定變為確定~頭壓縮是否有必要,MVC如何實現頭壓縮

網頁的頭部壓縮在頁面體積大的情況下非常有必要做&#xff0c;它會使頁面體積有一個明顯的減小&#xff0c;同時加到網頁從服務端下載到客戶端的速度&#xff0c;以下是我做的一個測試&#xff1a; 沒有使用頭壓縮時&#xff1a; 使用了頭壓縮后&#xff1a; 我們可以看到&…

android .9.png ”點九” 圖片制作方法

“點九”是andriod平臺的應用軟件開發里的一種特殊的圖片形式&#xff0c;文件擴展名為&#xff1a;.9.png 智能手機中有自動橫屏的功能,同一幅界面會在隨著手機(或平板電腦)中的方向傳感器的參數不同而改變顯示的方向,在界面改變方向后,界面上的圖形會因為長寬的變化而產生拉伸…

servlet3.0異步處理

Servlet3是Tomcat7出現的新特性&#xff0c;所以需要先安裝tomcat7 微信企業號使用回調模式時&#xff1a; 假如企業無法保證在五秒內處理并回復&#xff0c;可以直接回復空串&#xff0c;企業號不會對此作任何處理&#xff0c;并且不會發起重試。這種情況下&#xff0c;可以…

使用svn diff的-r參數的來比較任意兩個版本的差異

1 svn diff的用法1.1 對比當前本地的工作拷貝文件(working copy)和緩存在.svn下的版本庫文件的區別[plain] view plaincopyprint? svn diff 1.2 對比當前本地的工作拷貝文件(working copy)和任意版本A的差異[plain] view plaincopyprint? svn diff -rA 比如&#xff0c;以下…

深入理解HTTP Session

session在web開發中是一個非常重要的概念&#xff0c;這個概念很抽象&#xff0c;很難定義&#xff0c;也是最讓人迷惑的一個名詞&#xff0c;也是最多被濫用的名字之一&#xff0c;在不同的場合&#xff0c;session一次的含義也很不相同。這里只探討HTTP Session。為了說明問題…

Hibernate的懶加載session丟失解決方法

在web.xml加入spring提供的過濾器&#xff0c;延長session的生命周期 <!--Hibernate的懶加載session丟失解決方法 --><filter><filter-name>openSessionInView</filter-name><filter-class>org.springframework.orm.hibernate4.support.OpenSess…

Linux訪問其他進程空間,Linux環境進程間通信系列(五):共享內存

共享內存可以說是最有用的進程間通信方式&#xff0c;也是最快的IPC形式。兩個不同進程A、B共享內存的意思是&#xff0c;同一塊物理內存被映射到進程A、B各自的進程地址空間。進程A可以即時看到進程B對共享內存中數據的更新&#xff0c;反之亦然。由于多個進程共享同一塊內存區…

沖刺NO.8

Alpha沖刺第八天 站立式會議 項目進展 項目穩步進行&#xff0c;項目的基礎部分如基本信息管理&#xff0c;信用信息管理等部分已相對比較完善。 問題困難 技術困難在短期內很難發生質的變化&#xff0c;而本項目由于選擇了隊員不太熟悉的程序框架&#xff0c;所以所以項目的交…