Spring IOC 源码学习 3 特性介绍
1 Spring 架构图
- 大家可以注意到 Core Container 处于整个Spring 的核心地址
2 Spring Ioc的一些特性
2.1 alias
- 别名, 就是我们可以给bean 命名一个别名,也可叫nickname,如下代码,我们写一个xml bean 的配置文件,同时声明了一个对象Arequest
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="hello" class="smaug.customer.service.bean.Arequest"/>
<alias name="hello"alias="hello2"/>
<alias name="hello2"alias="hello3"/>
</beans>
启动类如下
public static void main(String[] args) {ConfigurableApplicationContext cx = (ConfigurableApplicationContext) SpringApplication.run(CustomerServiceApplication.class, args);
SpringApplication springApplication = new SpringApplication(CustomerServiceApplication.class);
String configLocation = "a.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(configLocation);
System.out.println(" hello2 -> " + applicationContext.getBean("hello2"));
System.out.println("hello3 -> " + applicationContext.getBean("hello3"));
springApplication.run(args);
}
得到如下输出
hello -> smaug.customer.service.bean.Arequest@4dd2ef54hello2 -> smaug.customer.service.bean.Arequest@4dd2ef54
hello3 -> smaug.customer.service.bean.Arequest@4dd2ef54
2.1.1 结论
- spring ioc 可以通过别名访问我们容气内的bean对象
2.2 FactoryBean
- FactoryBean 是用来生产Bean的工厂,获取FactoryBean 的bean 有点与众不同,下面看例子
public class BeanTest {public static void test() {
System.out.println("!23");
}
}
public class BeanFactoryBean implements FactoryBean<BeanTest>{private BeanTest beanTest;
/**
* 获取bean示例
* @return
* @throws Exception
*/
@Override
public BeanTest getObject() throws Exception {
if (Objects.isNull(beanTest)){
return new BeanTest();
}
return beanTest;
}
/**
* 返回class
* @return
*/
@Override
public Class<?> getObjectType() {
return BeanTest.class;
}
/**
* 是否是单例对象
* @return
*/
@Override
public boolean isSingleton() {
returnfalse;
}
xml 文件配置如下
beanTest1 => smaug.customer.service.controller.designMode.bean.BeanTest@5203c80fbeanTest2 => smaug.customer.service.controller.designMode.bean.BeanFactoryBean@439f2d87
2.2.1 结论
- 普通获取bean方法只能获取到普通的bean
- 如果想要获取到bean工厂的bean 需要在name前加"&"
2.3 factory-method
- factory-method 指定某个静态方法用来生成bean
public class FactoryMethodTest {public static HelloWorld getBean() {
return new HelloWorld();
}
}
xml配置
<bean id="factoryMethod" class="smaug.customer.service.controller.designMode.bean.FactoryMethodTest" factory-method="getBean"/>
启动类
System.out.println("factorymethod => " +applicationContext.getBean("factoryMethod"));
结果
factorymethod => smaug.customer.service.controller.designMode.bean.HelloWorld@621624b1
2.3.1 结论
- 需要指定一个static方法
- 需要显示指定factory-method 属性
2.4 BeanPostProcessor
bean 的后置处理器,bean实例化后,我们可以通过实现 BeanPostProcessor来对bean 做一些后置处理,大名鼎鼎的AOP 就是通过后置织入的方式实现的
BeanPostProcessor源码如下
public interface BeanPostProcessor {/**
* bean 初始化前调用的方法
*/
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
/**
* bean 初始化后调用的方法
*/
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
hello before smaug.customer.service.bean.Arequest@14b8a751hello after smaug.customer.service.bean.Arequest@14b8a751
以上是 Spring IOC 源码学习 3 特性介绍 的全部内容, 来源链接: utcz.com/a/29663.html