Spring學習(二):3個裝配bean方式
bean的生命週期
- Bean配置資訊定義了Bean的實現及依賴關係,Spring容器根據各種形式的Bean配置資訊在容器內部建立Bean定義登錄檔,然後根據登錄檔載入、例項化Bean,並建立Bean和Bean的依賴關係,最後將這些準備就緒的Bean放到Bean快取池中,以供外層的應用程式進行呼叫。
3個裝配方式
- 基於Java類的配置方式
- 基於XML的配置方式
- 基於註解的配置方式
1.基於Java類的配置方式
基於Java類定義Bean配置後設資料,其實就是通過Java類定義Spring配置後設資料,且直接消除XML配置檔案。
1.1要點:
- 必須要兩個註解:
- @Configuration :代替了xml配置.表明該類是一個配置類,該類應該包含在Spring應用上下文中如何建立bean的細節。
- @Bean : 告訴Spring,這個方法將會返回一個物件。一般用在構造器和Setter方法上
- 只需要這個兩個註解,就可以完成bean的裝配過程了。
- 非必須的註解:
- @import :用來引入別的類裡面同樣有@Configuration標籤的類。
- @importResource : 用來引入xml配置,實現xml配置方式和java類配置方式共存。
1.2例子
- 程式碼結構
- Configuration 包:用來放Java類的配置。其實其作用就是跟xml配置一樣的。所以此包下的類是Java類配置方式的核心
- Entity 包:用來放bean
- test 包: 測試
- 程式碼
- Configuration 包下的EntityConfig類:
@Configuration //表示這個類可以使用 Spring IoC 容器作為 bean 定義的來源
public class EntityConfig {
@Bean
public UserBean user(){
return new UserBean( student()); //有參構造
}
@Bean
public StudentBean student(){
return new StudentBean();
}
}
- Entity 包 UserBean類和StudentBean類:
public class UserBean {
private StudentBean studentBean;
public UserBean(){}
public UserBean(StudentBean studentBean){
this.studentBean=studentBean;
}
@Override
public String toString() {
return "this is UserBean";
}
public StudentBean getStudent(){
return studentBean;
}
}
public class StudentBean {
private String name;
private int age;
@Override
public String toString() {
return "this is StudentBean";
}
}
- test 包
@Test
public void test(){
ApplicationContext ctx=
new AnnotationConfigApplicationContext(EntityConfig.class); //應用上下問
UserBean userBean=ctx.getBean(UserBean.class);
StudentBean student = userBean.getStudent(); //從userBean裡,看是否獲得studenBean
System.out.println(student.toString());
}
1.3基於Java類的配置主要使用場景:
對於例項化Bean的邏輯比較複雜,則比較適合用基於Java類配置的方式
2.基於XML配置
其實可從基於java類配置方式去考慮,在Java類配置方式中,需要的兩個註解@Configuration 和@Bean 轉化成xml配置檔案裡說明。這樣的話java的配置類也可以不要了。
2.1要點
2.2 例子
- Entity類:跟上面類一樣,不需要該。
- xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="studentBean" class="cn.Entity.StudentBean"/>
<bean id="userBean" class="cn.Entity.UserBean">
//在userBean類裡面注入StudentBean 類,如果沒有這條會出現
NullPointerException異常
<property name="studentBean" ref="studentBean"/>
// name="" 是userBean 的屬性名稱。(需要setter方法)
// ref="" 是上面studentBean類注入的id。
</bean>
</beans>
- test類
@Test
public void testUserBean(){
ApplicationContext ctx=
new ClassPathXmlApplicationContext("spring.xml"); //配置檔案的絕對路徑
if (ctx!=null){
UserBean user = (UserBean) ctx.getBean(UserBean.class);
System.out.println(user.getStudent());
}
}
- 使用場景:
- 第三方類庫,如DataSource、JdbcTemplate等;
- 名稱空間,如aop、context等;
3.自動化裝配bean
可以對比前面兩種方法的變化,可以知道配置方法上的不同了。
- 相對於基於xml配置方法來說,不需要在xml裡面配置注入bean的資訊,而換成註解注入。
- 而相對與基於java配置方法來說,不需要在配置類中建立物件的方法,只需要在需要注入的地方,用註解就可以了
3.1要點
- 從兩個角度來實現自動化裝配:
- 元件掃描:Spring會自動發現應用上下文中所建立的bean。(需要在xml裡面配置,或者用註解)
- 自動裝配:Spring自動滿足bean之間的依賴。(需要用註解)
3.2例子
- 用@configuration來裝配bean
- 用到的註解
- @Configuration :代替了xml配置.表明該類是一個配置類,該類應該包含在Spring應用上下文中如何建立bean的細節。
- @ComponentScan:啟動元件掃描。(如果沒有設定範圍,預設該包下)
- @Autowired :自動注入。用在類下物件的注入
- @Compoent : 表明該類會作為元件類,並告知Spring要為該類建立bean。
- @RunWith(SpringJUnit4ClassRunner,class):在測試開始的時候自動建立Spring的應用上下文
- @ContextConfiguration(class=xxxx) :載入配置,在這裡是Config.class
- 用到的註解
很奇怪,如果不用@ContextConfiguration(class=xxxx) 這個載入配置,是掃描不到我測試類下面的@Autowired 註解。也就是我用正規建立上下文方法建立的話,test類下的物件是null的。 有待解決
- 程式碼結構
- Config類:用來裝配Spring規則。具有@Configuration和@ComponentScan註解
- StudentBean類和UserBean
- test類
- 例子
- Config類
@Configuration
@ComponentScan(basePackages = {"cn.Entity"})
public class Config { //不需像基於java配置一樣,用方法返回new 物件。
}
- SutdentBean和UserBean類
@Component
public class StudentBean {
private String name;
private int age;
@Override
public String toString() {
return "this is StudentBean";
}
}
***********************************************************************
@Component
public class UserBean {
private StudentBean studentBean;
public UserBean(){}
@Autowired
public UserBean(StudentBean studentBean){
this.studentBean=studentBean;
}
@Override
public String toString() {
return "this is UserBean";
}
public StudentBean getStudent(){
return studentBean;
}
public StudentBean getStudentBean() {
return studentBean;
}
}
- test類
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class UserBeanTest extends TestCase {
@Autowired
private UserBean userBean;
@Test
public void testUserBean(){
System.out.println(userBean.getStudent());
System.out.println(userBean);
}
}
- 用xml配置檔案來裝配bean
只是把上面的Config類,用xml替換掉。其實只是用xml文件寫一個掃描語句- spring.xml文件
<?xml version="1.0" encoding="UTF-8"?> <beans //省去很多約束 <context:component-scan base-package="cn.Entity"/> </beans>
- StudentBean類和UserBean類沒變
- Test類
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"/spring.xml"}) //載入xml配置 public class UserBeanTest extends TestCase { @Autowired private UserBean userBean; @Test public void testUserBean(){ System.out.println(userBean.getStudent()); System.out.println(userBean); } }
- spring.xml文件
- 使用場景:Bean的實現類是當前專案開發的,可直接在Java類中使用註解配置
4.總結
- 3個配置方式其實都很簡單,在開發過程中,都是推薦使用xml配置和自動化裝配。
- 不同配置方式比較
相關文章
- 二、Spring裝配BeanSpringBean
- Spring裝配Bean(二)SpringBean
- Spring學習筆記二: Bean裝配及生命週期Spring筆記Bean
- 初識Spring —— Bean的裝配(二)SpringBean
- Spring bean 裝配SpringBean
- Spring Bean裝配SpringBean
- Spring – 裝配BeanSpringBean
- Spring裝配Bean(四)SpringBean
- Spring裝配Bean(一)SpringBean
- Spring入門(二):自動化裝配beanSpringBean
- Spring Bean的3種裝配方式SpringBean
- Spring實戰:裝配bean-自動化裝配beanSpringBean
- Spring(三):IoC容器裝配Bean(xml配置方式和註解方式)SpringBeanXML
- Spring學習(二)Bean 作用域SpringBean
- Spring裝配Bean(六)Bean的作用域SpringBean
- Spring IOC 一——Spring容器裝配BeanSpringBean
- 初識Spring —— Bean的裝配(一)SpringBean
- spring自動裝配與spring_bean之間的關係(二)SpringBean
- Spring-04 Bean的自動裝配SpringBean
- Spring裝配Bean(七) Spring的執行時注入SpringBean
- 好程式設計師Java學習路線分享Spring建立Bean的3種方式程式設計師JavaSpringBean
- Spring 學習筆記(2) Spring BeanSpring筆記Bean
- 02-spring學習-配置beanSpringBean
- Spring入門(三):通過JavaConfig裝配beanSpringJavaBean
- Spring學習之——Bean載入流程SpringBean
- spring bean 擴充套件方式SpringBean套件
- Spring4.0MVC學習資料,註解自動掃描bean,自動注入bean(二)SpringMVCBean
- spring裝配Spring
- 4、Spring IOC容器 Bean物件例項化的3種方式SpringBean物件
- Spring注入Bean的幾種方式SpringBean
- SpringBoot(14)—註解裝配BeanSpring BootBean
- Spring 框架基礎(02):Bean的生命週期,作用域,裝配總結Spring框架Bean
- Spring中bean的四種注入方式SpringBean
- spring bean定義與載入方式SpringBean
- spring註冊bean的幾種方式SpringBean
- Spring學習筆記四: 從Spring容器中獲取BeanSpring筆記Bean
- Spring裝配Bean(五)profile註解和解決自動注入的歧義性SpringBean
- Spring - 高階裝配Spring