Spring Bean初始化簡介
Spring IOC 是Spirng反向控制應用程序需要的資源,說白了就是類的實例化(new)操作交由Spring來進行管理。在Spring中創建的實例化對象我們稱之爲Bean,接下來我們將介紹Spring 創建Bean的具體操作。
Spring Bean初始化操作
Spring Bean初始化操作有5中方式:
1 構造器初始化
首先創建我們要進行初始化的類BeanConstructor,具體代碼如下:
public class BeanConstructor {
public void fun() {
System.out.println("beanConstructor........");
}
}
在Spring xml配置文件中將BeanConstructor配置成Spring的Bean,具體配置如下:
<bean id="beanConstructor" class="cn.zhuoqianmingyue.ioc.di.initialization.BeanConstructor"></bean>
進行測試:
測試類具體代碼如下:
public class initializationBeanTest {
@Test
public void beanConstructor() {
ApplicationContext application = new ClassPathXmlApplicationContext("ioc-initialization.xml");
BeanConstructor beanConstructor = (BeanConstructor)application.getBean("beanConstructor");
beanConstructor.fun();
}
}
測試結果:
構造器初始化總結: 構造器初始化需要我們通過spring配置的bean標籤並且在其class屬性設置初始化類路徑來完成初始化操作。
2 靜態工廠初始化
創建我們靜態工廠類StaticFactory 通過靜態的getBean()方法獲取StaticFactoryBean 實例對象,具體代碼如下:
public class StaticFactory {
public static StaticFactoryBean getBean() {
return new StaticFactoryBean();
}
}
創建通過StaticFactory進行初始化的類StaticFactoryBean,具體代碼如下:
public class StaticFactoryBean {
public void fun() {
System.out.println("staticFactoryBean........");
}
}
Spring具體配置如下:
<bean id="staticFactoryBean" class="cn.zhuoqianmingyue.ioc.di.initialization.StaticFactory" factory-method="getBean"></bean>
進行測試:
測試代碼如下:
@Test
public void staticFactoryBean() {
ApplicationContext application = new ClassPathXmlApplicationContext("ioc-initialization.xml");
StaticFactoryBean staticFactoryBean = (StaticFactoryBean)application.getBean("staticFactoryBean");
staticFactoryBean.fun();
}
測試結果:
靜態工廠初始化初始化總結:需要我們爲需要實例化的對象提供一個工廠類並且獲取實例對象的方法必須是static的,然後通過bean標籤的class 指定工廠類路徑,factory-method屬性執行獲取實例化對象的靜態方法。
3 實例工廠初始化
創建我們實例工廠類InstanceFactory 通過靜態的getBean()方法獲取InstanceFactoryBean 實例對象,具體代碼如下:
package cn.zhuoqianmingyue.ioc.di.initialization;
public class InstanceFactory {
public InstanceFactoryBean getBean() {
return new InstanceFactoryBean();
}
}
創建通過InstanceFactory 進行初始化的類InstanceFactoryBean,具體代碼如下:
package cn.zhuoqianmingyue.ioc.di.initialization;
public class InstanceFactoryBean {
public void fun() {
System.out.println("InstanceFactoryBean........");
}
}
Spring具體配置如下:
<bean id="instanceFactory" class="cn.zhuoqianmingyue.ioc.di.initialization.InstanceFactory"></bean>
<bean id="instanceFactoryBean" factory-bean="instanceFactory" factory-method="getBean"></bean>
進行測試:
測試代碼如下:
@Test
public void instanceFactoryBean() {
ApplicationContext application = new ClassPathXmlApplicationContext("ioc-initialization.xml");
InstanceFactoryBean instanceFactoryBean = (InstanceFactoryBean)application.getBean("instanceFactoryBean");
instanceFactoryBean.fun();
}
測試結果:
實例工廠初始化總結:
1 需要創建一個獲取實例對象的方法的工廠類,
2 在Spring配置文件中將工廠類通過Bean標籤使其成爲Spring的Bean
3 在Spring配置文件中通過Bean標籤的factory-bean屬性設置成工廠類的Bean name factory-method屬性設置工廠類獲取實例對象的方法的名稱,來完成實例工廠初始化操作。
4 註解方式初始化
進行初始化操作需要我們在Spring的配置文件中配置 註解掃描的配置,配置內容如下:
<context:component-scan base-package="cn.zhuoqianmingyue"></context:component-scan>
cn.zhuoqianmingyue 是掃描註解的包路徑,該路徑意外的聲明註解的類將不會被識別爲Spring的Bean
4.1 @Component 初始化操作
爲我們需要初始化的類BeanAnnotation 聲明@Component()註解 並指定名稱爲beanAnnotation,具體代碼如下:
@Component("beanAnnotation")
public class BeanAnnotation {
public void fun() {
System.out.println("beanAnnotation........");
}
}
進行測試:
測試類代碼如下:
@Test
public void beanAnnotation() {
ApplicationContext application = new ClassPathXmlApplicationContext("ioc-initialization.xml");
BeanAnnotation instanceFactoryBean = (BeanAnnotation)application.getBean("beanAnnotation");
instanceFactoryBean.fun();
}
測試結果:
註解方式操作相對於xml配置方式更爲簡單 只需要在需要初始化的類上聲明@Component註解即可。
4.2 註解工廠初始化操作
創建我們註解工廠類AnnotationFactoryBean 並在該類上聲明@Configuration註解
在註解工廠類中創建getBean()方法獲取AnnotationFactoryBean 實例對象,並在該方法上聲明@Bean標籤,具體代碼如下:
@Configuration
public class AnnotationFactory {
@Bean("annotationFactoryBean")
public AnnotationFactoryBean getBean() {
return new AnnotationFactoryBean();
}
}
AnnotationFactoryBean 類代碼如下:
public class AnnotationFactoryBean {
public void fun() {
System.out.println("annotationFactoryBean........");
}
}
進行測試:
測試代碼如下:
@Test
public void annotationFactoryBean() {
ApplicationContext application = new ClassPathXmlApplicationContext("ioc-initialization.xml");
AnnotationFactoryBean annotationFactoryBean = (AnnotationFactoryBean)application.getBean("annotationFactoryBean");
annotationFactoryBean.fun();
}
測試結果:
註解工廠初始化操作 是通過在工廠類上聲明@Configuration 獲取實例方法上聲明@Bean來完成註解工廠初始化操作。
Spring 配置文件 ioc-initialization.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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd ">
<context:component-scan base-package="cn.zhuoqianmingyue"></context:component-scan>
<bean id="beanConstructor" class="cn.zhuoqianmingyue.ioc.di.initialization.BeanConstructor"></bean>
<bean id="staticFactoryBean" class="cn.zhuoqianmingyue.ioc.di.initialization.StaticFactory" factory-method="getBean"></bean>
<bean id="instanceFactory" class="cn.zhuoqianmingyue.ioc.di.initialization.InstanceFactory"></bean>
<bean id="instanceFactoryBean" factory-bean="instanceFactory" factory-method="getBean"></bean>
</beans>