Spring IOC之Bean初始化篇

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>

查看源码
下载源码

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值