在Spring中,Bean是一個由Spring IoC容器創建、管理、調用的Java對象。Spring創建Bean有三種方式,它們分別是基於XML配置文件創建、基於註解創建和基於Java配置類創建。本文將從多個方面詳細闡述這三種方式。
一、創建Bean的三種方式
1.1 基於XML配置文件創建
基於XML配置文件創建Bean是最經典的方式。它的主要流程是:先通過標籤在XML配置文件中定義Bean的基本信息,如ID、Class、scope等,然後通過標籤對Bean的屬性進行初始化。例如以下示例:
<bean id="student" class="com.example.Student"> <property name="name" value="張三"/> <property name="age" value="18"/> </bean>
上述配置文件中定義了一個名為”student”的Bean,它的Class為”com.example.Student”,scope默認為singleton(單例),並且在初始化時會設置它的name和age屬性。
1.2 基於註解創建
基於註解創建Bean是Spring 2.5版本後引入的一種方式。通過在Java類上添加註解,告訴Spring IoC容器該類是一個Bean,同時指定Bean的ID、Class等信息。例如:
@Component("student") public class Student { private String name; private int age; // getters and setters }
上述代碼中,@Component註解表示該類是一個Bean,並且指定了它的ID為”student”。Spring在掃描到該註解後,會自動註冊該Bean到IoC容器中。
1.3 基於Java配置類創建
基於Java配置類創建Bean是在Spring 3.0版本後引入的。它使用Java類代替XML配置文件,通過Java代碼的方式來創建和配置Bean。例如:
@Configuration public class AppConfig { @Bean public Student student() { Student student = new Student(); student.setName("張三"); student.setAge(18); return student; } }
上述代碼中,@Configuration註解表示該類是一個Java配置類,@Bean註解表示要創建一個Bean,並且指定了該Bean的Class為Student。然後通過創建Student對象並設置屬性,最後返回該對象來完成Bean的創建。
二、Spring注入Bean的三種方式
2.1 Setter方法注入
Setter方法注入是指通過在Bean類中創建Setter方法,然後在XML配置文件或Java配置類中將依賴的Bean注入到改方法中進行設置。例如:
public class Teacher { private Student student; public void setStudent(Student student) { this.student = student; } // other methods } <bean id="teacher" class="com.example.Teacher"> <property name="student" ref="student"/> </bean>
上述代碼中,Teacher依賴於Student,通過標籤將Student注入到Teacher類的setStudent()方法中進行設置。
2.2 構造方法注入
構造方法注入是指通過在Bean類中創建構造方法,然後在XML配置文件或Java配置類中將依賴的Bean通過構造方法的參數進行設置。例如:
public class Teacher { private Student student; public Teacher(Student student) { this.student = student; } // other methods } <bean id="teacher" class="com.example.Teacher"> <constructor-arg ref="student"/> </bean>
上述代碼中,Teacher依賴於Student,通過標籤將Student注入到Teacher類的構造方法中進行設置。
2.3 欄位注入
欄位注入是指通過在Bean類中創建欄位,並且在XML配置文件或Java配置類中將依賴的Bean直接注入到該欄位上進行設置。例如:
public class Teacher { @Autowired private Student student; // other methods } <bean id="teacher" class="com.example.Teacher"/>
上述代碼中,@Autowired註解表示要將依賴的Bean注入到該欄位上,Spring IoC容器會自動將Student注入到Teacher類的student欄位中進行設置。
三、Spring創建Bean的過程
Spring創建Bean的過程包括了Bean的實例化、Bean的屬性注入、Bean的初始化和Bean的銷毀過程。其中Bean的實例化是通過Java反射機制或工廠方法來創建Bean實例的;Bean的屬性注入是通過Setter方法或欄位注入來設置Bean的屬性值的;Bean的初始化是通過實現InitializingBean介面或定義init-method方法來完成的;Bean的銷毀是通過實現DisposableBean介面或定義destroy-method方法來完成的。
以下是完整的創建Bean的過程代碼示例:
public class Student implements InitializingBean, DisposableBean { private String name; private int age; public Student() { System.out.println("Bean實例化"); } public void setName(String name) { this.name = name; System.out.println("Setter方法注入"); } public void setAge(int age) { this.age = age; System.out.println("Setter方法注入"); } public void afterPropertiesSet() throws Exception { System.out.println("Bean初始化"); } public void destroy() throws Exception { System.out.println("Bean銷毀"); } // other methods } <bean id="student" class="com.example.Student" init-method="afterPropertiesSet" destroy-method="destroy"> <property name="name" value="張三"/> <property name="age" value="18"/> </bean>
上述代碼中,Bean的實例化和屬性注入放在了構造方法和Setter方法中實現,同時實現了InitializingBean介面和DisposableBean介面的方法來完成Bean的初始化和銷毀過程,並且通過init-method和destroy-method屬性指定了初始化和銷毀的方法。
四、Spring管理Bean的兩種方式
Spring管理Bean的方式有兩種,分別是單例模式和原型模式。單例模式是指在整個應用程序中只存在一個Bean實例;原型模式是指每次通過IoC容器獲取Bean實例時都會創建一個新的實例。
4.1 單例模式
單例模式是Spring默認的Bean管理方式,它保證在整個應用程序中只存在一個Bean實例。在XML配置文件或Java配置類中將Bean的scope屬性設置為singleton或省略scope屬性即可使用單例模式。例如:
<bean id="student" class="com.example.Student" scope="singleton"> <property name="name" value="張三"/> <property name="age" value="18"/> </bean>
上述代碼中,Bean的scope屬性設置為singleton,表示使用單例模式來管理Bean。
4.2 原型模式
原型模式是指每次通過IoC容器獲取Bean實例時都會創建一個新的實例。在XML配置文件或Java配置類中將Bean的scope屬性設置為prototype即可使用原型模式。例如:
<bean id="student" class="com.example.Student" scope="prototype"> <property name="name" value="張三"/> <property name="age" value="18"/> </bean>
上述代碼中,Bean的scope屬性設置為prototype,表示使用原型模式來管理Bean。
五、Spring創建Bean的方法
在Spring中,除了通過標籤、@Component註解和Java配置類來創建Bean外,還可以通過FactoryBean和BeanDefinitionRegistry介面來創建Bean。
5.1 FactoryBean創建Bean
FactoryBean是一個特殊的Bean,它可以通過用戶自定義的邏輯來創建其他Bean實例。FactoryBean介面定義了getObject()方法,該方法返回一個Object類型的Bean實例。例如:
public class MyFactoryBean implements FactoryBean<Student> { @Override public Student getObject() throws Exception { Student student = new Student(); student.setName("張三"); student.setAge(18); return student; } @Override public Class<? extends Student> getObjectType() { return Student.class; } @Override public boolean isSingleton() { return true; } } <bean id="myFactoryBean" class="com.example.MyFactoryBean"/> <bean id="student" factory-bean="myFactoryBean" factory-method="getObject"/>
上述代碼中,MyFactoryBean實現了FactoryBean介面,並且通過getObject()方法來創建一個Student實例。然後在XML配置文件中,將myFactoryBean定義為Bean,並且在student Bean中使用factory-bean和factory-method屬性來指定由myFactoryBean來創建Student實例。
5.2 BeanDefinitionRegistry介面創建Bean
BeanDefinitionRegistry介面是Spring IoC容器中的一個擴展介面,它可以通過編碼方式來創建Bean定義,並註冊到IoC容器中。例如:
public class MyBeanDefinitionRegistry implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { RootBeanDefinition beanDefinition = new RootBeanDefinition(Student.class); beanDefinition.getPropertyValues().add("name", "張三"); beanDefinition.getPropertyValues().add("age", 18); registry.registerBeanDefinition("student", beanDefinition); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // do nothing } } <bean class="com.example.MyBeanDefinitionRegistry"/>
上述代碼中,MyBeanDefinitionRegistry實現了BeanDefinitionRegistryPostProcessor介面,並在postProcessBeanDefinitionRegistry()方法中,通過RootBeanDefinition來創建Student實例,並且通過registerBeanDefinition()方法將該實例的Bean定義註冊到IoC容器中。
六、Spring創建對象的三種方式
在Spring中,除了創建Bean外,還可以使用三種方式來創建對象,它們是new關鍵字、Spring上下文和Spring工廠方法。
6.1 new關鍵字創建對象
使用new關鍵字創建對象是最傳統的方式,它通過Java類的構造方法來創建對象。例如:
Student student = new Student(); student.setName("張三"); student.setAge(18);
上述代碼中,使用new關鍵字創建一個Student對象。
6.2 Spring上下文創建對象
使用Spring上下文創建對象是指在Spring IoC容器中獲取Bean實例,然後通過getType()方法獲取它的Class類型,並通過反射機制來創建該類的實例。例如:
AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Student student = context.getBean("student", Student.class);
上述代碼中,通過ClassPathXmlApplicationContext()方法來創建一個Spring上下文,並通過getBean()方法來獲取名為”Student”的Bean實例,並通過Student.class類型來創建該類的實例。
6.3 Spring工廠方法創建對象
使用Spring工廠方法創建對象是指在Spring IoC容器中通過工廠方法來創建對象。例如:
public class MyFactory { public Student createStudent() { Student student = new Student(); student.setName("張三"); student.setAge(18); return student; } } <bean id="myFactory" class="com.example.MyFactory"/> <bean id="student" factory-bean="myFactory" factory-method="createStudent"/>
上述代碼中,MyFactory類定義了一個createStudent()方法,該方法通過new關鍵字來創建Student實例,並設置它的屬性。然後再XML配置文件中,將myFactory定義為Bean,並通過factory-bean和factory-method屬性來指定由myFactory來創建Student實例。
七、Bean在Spring中原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/201108.html
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/201108.html