Spring容器上下文

目录

一 什么是spring容器上下文

二 spring容器上下文可以做什么

三 如何使用

1.实现ApplicationContextAware接口

2.代码测试


一 什么是spring容器上下文

你可以把它理解成就是spring容器,它主要用于管理Bean对象,包括bean的生命周期,bean的注入等等。

二 spring容器上下文可以做什么

我们刚刚上面说spring容器上下文主要就是对bean对象的管理,那么也就是说我们可以通过这个spring容器上下文得到各种bean对象。

可能你会说,得到bean对象不是很简单嘛?直接使用@Autwrie注解注入就可以得到bean对象了。

你说的对,但是通过注解注入bean对象有一个前提,就是你本身这个类也要交给spring容器管理,这样你才可以通过@Autwrie注解注入bean对象。但是有时候,不一定所有的类对象都要交给spring容器,那么如果没有交给spring管理的类想要从spring容器中的到bean对象该怎么做呢?这时候就可以通过这个spring容器上下文来得到我想要的任何bean对象了。

三 如何使用

1.实现ApplicationContextAware接口

就像我们上面说的,我们需要得到bean对象,而bean对象都有spring容器上下文管理,所以我们需要先得到spring容器上下文对象。

我们需要定义一个类,实现这个接口,因为这个接口有一个

setApplicationContext(ApplicationContext applicationContext)

方法,这个方法里面的参数ApplicationContext对象就是spring容器上下文对象,这个方法不需要我们手动调用,它是当你启动spring后,只要你的类实现了ApplicationContextAware接口,它就会自动调用这个方法,同时帮你ApplicationContext对象当作参数传到这个方法。

那么你就相当于得到到spring容器上下文对象啦,这个时候再调用spring容器上下文对象中的方法就可以得到bean对象啦。

这里提供一个代码示例:

package com.feisi.test.applicationContext;

import org.springframework.beans.BeansException;
//import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.lang.annotation.Annotation;
import java.sql.SQLOutput;
import java.util.Map;

@Component
public class ApplicationContextHolder implements ApplicationContextAware {
    private static ApplicationContext CONTEXT ;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("得到applicationContext容器:"+applicationContext);
        CONTEXT = applicationContext ;
    }

    /**
     * 从ApplicationContext容器中获取对应的Bean对象
     */
    public static <T> T getBean(Class<T> clazz){
        return CONTEXT.getBean(clazz) ;
    }

    /**
     * 根据bean的name获取bean对象
     */
    public static Object getBean(String name) {
        return CONTEXT.getBean(name);
    }

    /**
     * 根据bean的name和类型获取bean对象
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return CONTEXT.getBean(name, clazz);
    }

    /**
     * 按类型获取一组ioc容器bean。
     */
    public static <T> Map<String, T> getBeansOfType(Class<T> clazz) {
        return CONTEXT.getBeansOfType(clazz);
    }
    /**
     * 查找bean是否有注释。
     */
    public static <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) {
        return CONTEXT.findAnnotationOnBean(beanName, annotationType);
    }

    /**
     * 获取ApplicationContext对象。
     */
    public static ApplicationContext getInstance() {
        return CONTEXT;
    }
}

记住这个类也要交给spring容器管理,不然spring扫描不到这个类就不会执行了。

2.代码测试

接下来我们进行测试,我们测试目的就是用一个没有交给spring容器的类,然后通过这个方法从Spring上下文容器中的到Student的Bean对象。

①先定义一个Student对象,并且交给spring容器管理

package com.feisi.test.pojo;

import lombok.Data;
import org.springframework.stereotype.Service;

@Service
@Data
public class Student {
    private String name ;
    private Integer age ;
}

2.在定义一个类,不交给spring容器管理

package com.feisi.test.demo;

import com.feisi.test.applicationContext.ApplicationContextHolder;

/**
 * 这个类不交给spring容器,但是想要访问spring容器中的Bean
 */
public class ApplicationContestDemo {
    public void getSpringBean(Object object){
        Object ob = ApplicationContextHolder.getBean(object.getClass());
        System.out.println("从容器中的到Bean对象:"+ob);
    }
}

  我们在这个类中,通过我们的配置类中的getBean方法来获取对象的bean对象。其实是因为我们在这个类中得到了spring容器上下文对象,然后通过调用spring容器上下文对象中的根据类型获取bean对象的方法来得到对应的bean对象。


3.启动spring服务

@SpringBootTest
class TestApplicationTests {
//    @Autowired
//    private Student student ;

    @Test
    void contextLoads() {
       new ApplicationContestDemo().getSpringBean(new Student());
    }

}

我们一定要启动这个spring服务,再去调用这个方法。

因为整个流程是这样的:

我们在启动spring服务后,spring会自动执行实现了ApplicationContextWare接口的类中的实现方法 setApplicationContext(ApplicationContext applicationContext),这样spring就会把spring容器上下文对象我们实现的这个方法,我们就可以从这个方法得到spring容器上下文对象,然后就可以定义方法,从spring容器上下文对象中调用方法获取bean对像。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值