在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-hant/n/201108.html
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/201108.html
微信掃一掃
支付寶掃一掃