Spring基础-如何获取ApplicationContext

本文介绍了在Spring框架中通过@Autowired注解、实现ApplicationContextAware接口及构造器注入等三种方式获取ApplicationContext的方法与步骤,并深入解析了每种方式的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种方法:

使用@Autowired方法来获取

举个栗子

public class User {


    @Autowired
    //@Resource
    //@Inject
    private ApplicationContext applicationContext;

    public void show() {
        System.out.println("applicationContext = " + applicationContext.getClass());
    }
}

这三个注解都可以,注意第三个注解要引入jar包.

 

 

第二种方式:

实现ApplicationContextAware接口

 

@Component
public class Book implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public void show() {
        System.out.println("applicationContext = " + applicationContext.getClass());
    }
}

 

 

第三种方式

使用构造器,在构造器里传入


/**
* spring4.3新特性
* 1.构造函数只能有一个.
* 2.构造器参数必须在spring容器中.
*/

@Component
public class Bank { private ApplicationContext applicationContext; public Bank(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } public void show() { System.out.println("applicationContext = " + applicationContext.getClass()); } }

有一定局限性

构造函数不能为空,

 

 

 

 详细分析第二种方式

如何自己实现第二中方式

 

第一步写一个接口

public interface MyApplicationContextAware {

    public  void setApplicationContext(ApplicationContext applicationContext);
}

然后实现这个接口

@Component
public class Dog implements MyApplicationContextAware {
    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    public void show() {
        Cat bean = applicationContext.getBean(Cat.class);
        System.out.println("bean = " + bean);
        System.out.println("applicationContext = " + applicationContext);
    }
}

再写一个  MyPostProcessor实现BeanPostProcessor,在postProcessBeforeInitialization()方法里面,判断,如果是MyApplicationContextAware这个接口的实现类,那就可以调用setApplicationContext方法设置值.

@Component
public class MyPostProcessor implements BeanPostProcessor {

    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof MyApplicationContextAware) {
            ((MyApplicationContextAware) bean).setApplicationContext(applicationContext);
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

这样就可以自己实现第二种方式的注入了.

 

源码:ApplicationContextAwareProcessor.class 

转载于:https://www.cnblogs.com/songfahzun/p/9236183.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值