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>