您好,登錄后才能下訂單哦!
本篇內容主要講解“Spring IOC的bean聲明方式有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Spring IOC的bean聲明方式有哪些”吧!
Spring簡介
Spring不是服務于開發web項目的功能,或業務。而是服務于項目的開發,方便各層間的解耦調用,方便對類的批量管理,是提高軟件開發效率,降低后期維護成本的框架。
Spring的核心思想是IOC(控制反轉),AOP(切面編程)兩點。
IOC:即不再需要程序員去顯式地New一個對象,而是把Spring框架把框架創建出的對象拿來用。因為是spring框架創建的對象,對象都在spring框架對象中保存,亦稱為spring容器,這樣spring就知道當前項目中都創建了哪些對象,這個對象歸屬于那一層,該如何管理。想使用spring的其他功能第一點就是要用spring的對象,也稱為將控制權交給spring管理。
AOP:對某種路徑下的所有類,或有共同特性的類或方法統一管理,在原任務執行的前后,加入新功能。做出監控,初始化,整理,銷毀等一系列統一的伴隨動作。
如果你從事Java編程有一段時間了, 那么你或許會發現(可能你也實際使用過) 很多框架通過強迫應用繼承它們的類或實現它們的接口從而導致應用與框架綁死。這種侵入式的編程方式在早期版本的Struts以及無數其他的Java規范和框架中都能看到。Spring竭力避免因自身的API而弄亂你的應用代碼。Spring不會強迫你實現Spring規范的接口或繼承Spring規范的類,相反,在基于Spring構建的應用中,它的類通常沒有任何痕跡表明你使用了Spring。 最壞的場景是, 一個類或許會使用Spring注解, 但它依舊是POJO。
任何一個有實際意義的應用(肯定比Hello World示例更復雜) 都會由兩個或者更多的類組成, 這些類相互之間進行協作來完成特定的業務邏輯。 按照傳統的做法, 每個對象負責管理與自己相互協作的對象(即它所依賴的對象) 的引用, 這將會導致高度耦合和難以測試的代碼。
IOC聲明Bean
首先創建的Maven Poject,詳細包結構如下
其中AOP會在下一篇進行講解;
Controller_.java
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("/ApplicationContext.xml");
Service_ s = (Service_) ctx.getBean("service_Impl1_new");
System.out.println(s);
s.show();
}
由于Spring無法單獨演示,所以Controller_.java是創建的是一個Servlet,直接調用doPost或者doGet方法,進行Service的實現,輸出Service_對象s,執行show方法。
Service_.java
public interface Service_ {
public void show();
}
創建一個Service接口,用來實現Spring。
1.無參構造方法聲明bean
Service_Impl1.java
public class Service_Impl1 implements Service_{
public Service_Impl1() {
// TODO Auto-generated constructor stub
System.out.println("service1-無參構造方法");
}
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("Service_Impl1");
}
}
重寫Service_的show方法輸出實現了Service_Impl1,編寫無參構造方法。
ApplicationContext.xml
只需要設置id與class,class對應Service_Impl1,id則是Controller_.java調用的getBean中的參數。運行結果見自定義構造方法注入bean。
2.自定義構造方法聲明bean
Service_Impl2.java
public class Service_Impl2 implements Service_{
public Service_Impl2(int a) {
// TODO Auto-generated constructor stub
System.out.println("service2-自定義構造參數:"+a);
}
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("Service_Impl2");
}
}
ApplicationContext.xml
這是構造方法中參數的設置,index顧名思義就是索引的意思,其中a參數是第0個,value是參數的值。
3.單實例 懶加載聲明bean
Service_Impl3.java
public class Service_Impl3 implements Service_{
public Service_Impl3() {
// TODO Auto-generated constructor stub
System.out.println("service3-懶加載 單實例");
}
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("Service_Impl3");
}
}
ApplicationContext.xml
lazy-init=“true” 設置懶加載,也就是調用的時候才會加載bean,不會自動加載;scope=“singleton” 作用域標簽,單實例也就是只創建一個實例。
4.參數引用聲明bean
Service_Impl4.java
public class Service_Impl4 implements Service_{
Service_ s3;
public Service_ getS3() {
return s3;
}
public void setS3(Service_ s3) {
this.s3 = s3;
}
public Service_Impl4() {
// TODO Auto-generated constructor stub
System.out.println("service4-參數引用bean");
}
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("Service_Impl4");
}
}
ApplicationContext.xml
參數標簽,name是Service_Impl4中的參數s3,ref鏈接要引用的bean。
5.初始化屬性聲明bean
Service_Impl5.java
public class Service_Impl5 implements Service_{
String name;
ArrayList list;
HashMap map;
HashSet set;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((list == null) ? 0 : list.hashCode());
result = prime * result + ((map == null) ? 0 : map.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((set == null) ? 0 : set.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Service_Impl5 other = (Service_Impl5) obj;
if (list == null) {
if (other.list != null)
return false;
} else if (!list.equals(other.list))
return false;
if (map == null) {
if (other.map != null)
return false;
} else if (!map.equals(other.map))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (set == null) {
if (other.set != null)
return false;
} else if (!set.equals(other.set))
return false;
return true;
}
@Override
public String toString() {
return "Service_Impl5 [name=" + name + ", list=" + list + ", map=" + map + ", set=" + set + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList getList() {
return list;
}
public void setList(ArrayList list) {
this.list = list;
}
public HashMap getMap() {
return map;
}
public void setMap(HashMap map) {
this.map = map;
}
public HashSet getSet() {
return set;
}
public void setSet(HashSet set) {
this.set = set;
}
public Service_Impl5() {
// TODO Auto-generated constructor stub
System.out.println("service5-初始化屬性");
}
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("Service_Impl5");
}
}
其中初始化參數有list,map,set以及普通參數,重寫了hashCode和equals方法,詳見HashMap內存泄漏;重寫toString方法用來輸出初始化屬性。
ApplicationContext.xml
QQQ
WWW
111
222鄭州哪個婦科醫院好 http://www.sptdfk.com/
其中map標簽內使用進行賦值。其他的正常使用property和value進行賦值。
6.初始化屬性引用方法返回值聲明bean
Service_Impl6.java
public class Service_Impl6 implements Service_{
String s5_toString;
public String getS5_toString() {
return s5_toString;
}
public void setS5_toString(String s5_toString) {
this.s5_toString = s5_toString;
}
public Service_Impl6() {
// TODO Auto-generated constructor stub
System.out.println("service6-調用方法返回值");
}
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("Service_Impl6 返回值"+s5_toString);
}
}
其中調用了Service_Impl5的toString方法并且進行了輸出。
ApplicationContext.xml
固定用來聲明調用方法返回值。
引用目標的bean
引用目標的方法
7.靜態工廠——聲明工廠bean
Service_Impl7.java
public class Service_Impl7 implements Service_{
public static Service_ StaticFactory(int num) {
switch (num) {
case 1:
return new Service_Impl1();
case 2:
return new Service_Impl2(100);
case 3:
return new Service_Impl3();
case 4:
return new Service_Impl4();
case 5:
return new Service_Impl5();
default:
return new Service_Impl6();
}
}
public Service_Impl7() {
// TODO Auto-generated constructor stub
System.out.println("service7-靜態工廠");
}
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("Service_Impl7");
}
}
靜態工廠在實現類中使用了switch語句進行模擬,靜態工廠在方法前加上static關鍵字,分別調用上面的其他實現類方法。
ApplicationContext.xml
使用構造方法注入的方法來賦值 ;factory-method=“StaticFactory” ( factory-method工廠的方法名)
8.實例工廠——聲明工廠bean
Service_Impl8.java
public class Service_Impl8 implements Service_{
public Service_ factory1(int num) {
switch (num) {
case 1:
return new Service_Impl1();
case 2:
return new Service_Impl2(100);
case 3:
return new Service_Impl3();
case 4:
return new Service_Impl4();
case 5:
return new Service_Impl5();
default:
return new Service_Impl6();
}
}
public Service_Impl8() {
// TODO Auto-generated constructor stub
System.out.println("service8-實例工廠");
}
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("Service_Impl8");
}
}
ApplicationContext.xml
創建實例工廠bean,首先創建一個實例工廠的bean,然后再創建一個工廠方法的bean去調用工廠的bean。
調用的時候要調用工廠方法的bean,這里就要調用service_Impl8_new
9.注解聲明bean
@Service:用于標注業務層組件
@Controller:用于標注控制層組件(如struts中的action)
@Repository:用于標注數據訪問組件,即DAO組件
@Component(value="*"):泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注
Service_Impl9.java
@Service
public class Service_Impl9 implements Service_{
public Service_Impl9() {
// TODO Auto-generated constructor stub
System.out.println("service9-注解注入bean");
}
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("Service_Impl9");
}
}
@Service進行bean的聲明(注解只能聲明無參構造方法,使用注解默認聲明的bean是類名的首字母小寫),這里聲明的bean的id應該是service_Impl9。
ApplicationContext.xml
使用注解需要加上注解掃描,其中base-package是掃描的目錄,一般使用的是項目的根目錄,以后使用SpringMVC的話,就不用掃描Controller。
注解寫入bean
@Resource(name="" type="")bean寫入
@Autowired/@Qualifier
@inject/@named
到此,相信大家對“Spring IOC的bean聲明方式有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。