转载

Spring IOC 源码学习 3 特性介绍

Spring IOC 源码学习 3 特性介绍
  • 大家可以注意到 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() {
        return false;
    }
复制代码

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

复制代码
原文  https://juejin.im/post/5f005f9ce51d4534c6541d35
正文到此结束
Loading...