微信公眾號:compassblog
歡迎關注、轉發,互相學習,共同進步!
有任何問題,請後臺留言聯絡!
1、Spring中的兩種容器
在系列(一)中我們已經知道,Spring 是管理物件的容器,其中有2種基本的容器,一種是 ApplicationContext,另一種是 BeanFactory (這種在開發中已經不再使用)。兩種容器的區別如下:
ApplicationContext:這種容器在啟動載入 applicationContext.xml 配置檔案時就會建立
BeanFactory:這種容器在 getBean 的時候才會建立生成類的例項
2、Spring中Bean 的註解管理方式例項
(1)、新建專案,引入相關 jar 包,如下圖所示:
(2)、在 src 下新建配置檔案,開啟使用註解代理配置,程式碼如下:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd ">
<!-- 指定掃描com.spring.bean報下的所有類中的註解.
掃描包時,會掃描指定包下的所有子包
-->
<context:component-scan base-package="com.spring.bean"></context:component-scan>
</beans>
複製程式碼
(3)、將物件註冊到容器,並通過註解給屬性注入值,程式碼如下:
Student.java
package com.spring.bean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
@Component("stu")
@Service("stu") // service層
@Controller("stu") // web層
@Repository("stu")// dao層
public class Student {
//基本屬性
private String name;
@Value("22")
private int age;
@Autowired //自動裝配,如果匹配多個型別一致的物件,將無法選擇具體注入哪一個物件
private Book book;
//setter和getter方法
public String getName() {
return name;
}
@Value("孔乙己")
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", book=" + book.toString()
+ "]";
}
}
複製程式碼
Book.java
package com.spring.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("book")
public class Book {
//基本屬性
@Value("Java開發")
private String name;
@Value("68")
private double price;
//setter和getter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Book [name=" + name + ", price=" + price + "]";
}
}
複製程式碼
(4)、書寫測試類,程式碼如下:
TestDemo.java
package com.spring.test;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.bean.Student;
public class TestDemo {
@Test
public void fun1(){
//1 建立容器物件
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//2 向容器獲取stu物件
Student stu1 = (Student) ac.getBean("stu");
//3 列印stu物件
System.out.println(stu1.toString());
}
}
複製程式碼
(5)、使用 JUnit4 進行測試,結果如下圖所示:
3、Spring 中 Bean 管理的常用註解
(1)、 @Component 元件:作用在類上
Spring中提供 @Component 的三個衍生註解,功能目前是一致的,這三個註解是為了讓標註類本身的用途更加清晰。
@Controller : web 層
@Service : service 層
@Repository : dao 層
(2)、屬性注入的註解:使用註解注入的方式,可以不用提供 set 方法
@Value :用於注入普通型別
@Autowired :自動裝配: 預設按型別進行裝配,按名稱注入
注意:如果匹配多個型別一致的物件,將無法選擇具體注入哪一個物件@Qualifier :強制使用名稱注入,告訴spring容器自動裝配哪個名稱的物件
@Resource :手動注入,指定注入哪個名稱的物件,相當於 @Autowired 和 @Qualifier 一起使用
(3)、Bean 作用範圍的註解
@Scope:
singleton :單例
prototype :多例
(4)、Bean 生命週期配置的註解
@PostConstruct :相當於 init-method方法
@PreDestroy :相當於 destroy-method方法
4、Spring 中 Bean 管理方式的比較
基於XML的配置 | 基於註解的配置 | |
---|---|---|
Bean 定義 | <bean id=" " class=" "/> | @Component 或者其衍生類 |
Bean 名稱 | 通過 id 或 name 制定 | @Component(" ") |
Bean 注入 | <property> 屬性或者或者 p 名稱空間 | @Autowired 或者 @Qualifier 或者 @Resource |
Bean 作用範圍 | scope 範圍屬性 | @Scope |
Bean 宣告過程 | 初始化 init-methode 和銷燬 destroy-method | 初始化 @PostConstruct 和銷燬 @PreDestroy |
基於XML的配置:結構清晰,但開發不便
基於註解的配置:屬性注入容易,開發方便
關注微信公眾號compassblog,後臺回覆 “Spring系列二” 獲取本專案原始碼
您可能還喜歡:
本系列後期仍會持續更新,歡迎關注!
如果你認為這篇文章有用,歡迎轉發分享給你的好友!
本號文章可以任意轉載,轉載請註明出處!