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@4dd2ef54

hello2 -> 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@5203c80f

beanTest2 => 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@14b8a751

hello after smaug.customer.service.bean.Arequest@14b8a751

以上是 Spring IOC 源码学习 3 特性介绍 的全部内容, 来源链接: utcz.com/a/29663.html

回到顶部