精华内容
参与话题
问答
  • ![图片说明](https://img-ask.csdn.net/upload/201704/18/1492519951_308431.png) 为什么使用@Autowired 和使用ApplicationContext获取的bean不是同一个实例
  • import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework....
    
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    
    
    @Component
    public class SpringUtil implements ApplicationContextAware {
    
        private static ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            
            if(SpringUtil.applicationContext == null) {
                SpringUtil.applicationContext = applicationContext;
            }
        }
    
        //获取applicationContext
        public static ApplicationContext getApplicationContext() {
            return applicationContext;
        }
    
        //通过name获取 Bean. 
        public static Object getBean(String name){
            return getApplicationContext().getBean(name);
        }
    
        //通过class获取Bean.
        public static <T> T getBean(Class<T> clazz){
            return getApplicationContext().getBean(clazz);
        }
    
        //通过name,以及Clazz返回指定的Bean
        public static <T> T getBean(String name,Class<T> clazz){
            return getApplicationContext().getBean(name, clazz);
        }
    

     

    展开全文
  • 想要获取容器中的信息,首先需要拿到 ApplicationContext 实例, 获取ApplicationContext 实例的方法一般有两种, 一是,启动时接收返回的ApplicationContext 实例,并保存到某个公共变量上。 二是,实现...

    想要获取容器中的信息,首先需要拿到 ApplicationContext 实例,

    获取 ApplicationContext 实例的方法一般有两种,

    一是,启动时接收返回的ApplicationContext 实例,并保存到某个公共变量上。

    二是,实现 ApplicationContextAware 接口。

     

    方法一:

    Spring Boot 入口类 MyApplication 

    Java代码 

    1. @SpringBootApplication  
    2. @ServletComponentScan  
    3. public class MyApplication {  
    4.   
    5.     private static Logger log = LoggerFactory.getLogger(IotHubApplication.class);  
    6.     private static ApplicationContext applicationContext;  
    7.   
    8.     public static ApplicationContext getApplicationContext(){  
    9.         return applicationContext;  
    10.     }  
    11.   
    12.     public static void main(String[] args) {  
    13.         applicationContext = SpringApplication.run(IotHubApplication.class, args);  
    14.     }  
    15. }  

     

     

    方法二:

    自定义工具类 SpringUtil,实现 ApplicationContextAware 接口。

    Java代码 

    1. import org.springframework.beans.BeansException;  
    2. import org.springframework.context.ApplicationContext;  
    3. import org.springframework.context.ApplicationContextAware;  
    4. import org.springframework.stereotype.Component;  
    5.   
    6. //加入@Component注解,让spring扫描到该bean  
    7. @Component  
    8. public class SpringUtil implements ApplicationContextAware {  
    9.       
    10.     private static ApplicationContext applicationContext;  
    11.   
    12.     @Override  
    13.     public void setApplicationContext(ApplicationContext applicationContext)  
    14.             throws BeansException {  
    15.         if (SpringUtil.applicationContext == null) {  
    16.             SpringUtil.applicationContext = applicationContext;  
    17.         }  
    18.     }  
    19.   
    20.     // 获取applicationContext  
    21.     public static ApplicationContext getApplicationContext() {  
    22.         return applicationContext;  
    23.     }  
    24.   
    25.      //通过name获取 Bean.  
    26.     public static Object getBean(String name){  
    27.         return getApplicationContext().getBean(name);  
    28.     }  
    29.   
    30.     //通过class获取Bean.  
    31.     public static <T> T getBean(Class<T> clazz){  
    32.         return getApplicationContext().getBean(clazz);  
    33.     }  
    34.   
    35.     //通过name,以及Clazz返回指定的Bean  
    36.     public static <T> T getBean(String name,Class<T> clazz){  
    37.         return getApplicationContext().getBean(name, clazz);  
    38.     }  
    39. }  

     

    关于注解@Component的说明:

    1@Component泛指各种组件,就是说当我们的类不属于 @Controller@Service@repository等的时候,我们就可以使用@Component来标注这个类。

    2、被 @controller @service@repository @component 注解的类,都会纳入spring容器中进行管理 

     

    关于ApplicationContextAware接口的说明:

    Spring容器会检测容器中的所有Bean

    如果发现某个Bean实现了ApplicationContextAware接口,

    Spring容器会在创建该Bean之后,

    自动调用该beansetApplicationContext(ApplicationContext applicationContext)方法,

    调用该方法时,会将容器本身作为参数传给该方法。

     

     

    SpringUtil使用示例

    Java代码 

    1. // 容器中的bean总数  
    2. System.out.println(SpringUtil.getApplicationContext()  
    3.         .getBeanDefinitionCount());  
    4.   
    5. // 取得容器中的所有beanName,并打印包含keycloak关键词的  
    6. String beanNames[] = SpringUtil.getApplicationContext()  
    7.         .getBeanDefinitionNames();  
    8. for (String beanName : beanNames) {  
    9.     if (beanName.contains("keycloak") || beanName.contains("Keycloak")) {  
    10.         System.out.println(beanName);  
    11.     }  
    12. }  
    13. // 获取 HelloController 实例  
    14. HelloController helloController = SpringUtil.getApplicationContext()  
    15.         .getBean(HelloController.class);  
    16. System.out.println(helloController.hello("huangqiqing"null));  

     

    上面示例输出结果:

    515

    keycloakClientRequestFactoryProd

    keycloakClientRequestFactory

    keycloakRestTemplate

    KeycloakConfigResolver

    keycloakAuthenticationProcessingFilterRegistrationBean

    keycloakPreAuthActionsFilterRegistrationBean

    keycloakAuthenticationProcessingFilter

    keycloakPreAuthActionsFilter

    keycloakAuthenticatedActionsFilter

    keycloakSecurityContextRequestFilter

    org.keycloak.adapters.springboot.KeycloakAutoConfiguration

    getKeycloakContainerCustomizer

    tomcatKeycloakContextCustomizer

    keycloak-org.keycloak.adapters.springboot.KeycloakSpringBootProperties

    Hello World huangqiqing

     

     

     

    转载于:https://my.oschina.net/u/4058864/blog/2995532

    展开全文
  •   Spring中的容器对象接口是ApplicationContext,其作用就是加载配置文件,并初始化所有的Bean对象(容器启动时)。其实现类主要有2个,分别为: ClassPathXmlApplicationContext:加载类路径下的Spring配置...

      Spring中的容器对象接口是ApplicationContext,其作用就是加载配置文件,并初始化所有的Bean对象(容器启动时)。其实现类主要有2个,分别为:

    ClassPathXmlApplicationContext:加载类路径下的Spring配置文件
    FileSystemXmlApplicationContext:加载本地磁盘的Spring配置文件

      在Spring容器启动后,即可获取Bean对象:

    
            //加载Spring配置文件
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("org.pc");
            //获取Bean对象
            applicationContext.getBean(User.class);
    展开全文
  • spring手动获取容器中的bean

    千次阅读 2018-02-19 12:04:31
    只需要定义一个bean,这个bean继承ApplicationContextAware如下:public class SpringContextHolder implements ApplicationContextAware { private static ApplicationContext applicationContext = null; /*...

    只需要定义一个bean,这个bean继承ApplicationContextAware

    如下:

    public class SpringContextHolder implements ApplicationContextAware {  
        private static ApplicationContext applicationContext = null;  
      
        /** 
         * 获取静态变量中的ApplicationContext. 
         */  
        public static ApplicationContext getApplicationContext() {  
            assertContextInjected();  
            return applicationContext;  
        }  
      
        /** 
         * 从静态变量applicationContext中得到Bean, 自动转型为所赋值对象的类型. 
         */  
        @SuppressWarnings("unchecked")  
        public static <T> T getBean(String name) {  
            assertContextInjected();  
            return (T) applicationContext.getBean(name);  
        }  
      
        /** 
         * 从静态变量applicationContext中得到Bean, 自动转型为所赋值对象的类型. 
         */  
        public static <T> T getBean(Class<T> requiredType) {  
            assertContextInjected();  
            return applicationContext.getBean(requiredType);  
        }  
      
        /** 
         * 清除SpringContextHolder中的ApplicationContext为Null. 
         */  
        public static void clearHolder() {  
            applicationContext = null;  
        }  
      
        /** 
         * 实现ApplicationContextAware接口, 注入Context到静态变量中. 
         */  
        @Override  
        public void setApplicationContext(ApplicationContext applicationContext) {  
            SpringContextHolder.applicationContext = applicationContext;  
        }  
      
        /** 
         * 检查ApplicationContext不为空. 
         */  
        private static void assertContextInjected() {  
            Validate.validState(applicationContext != null,  
                    "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");  
        }  
      
    }

    把上述bean定义到spring.xml里头,那么

    Spring容器会检测容器中的所有Bean,如果发现某个Bean实现了ApplicationContextAware接口,Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContextAware()方法,调用该方法时,会将容器本身作为参数传给该方法——该方法中的实现部分将Spring传入的参数(容器本身)赋给该类对象的applicationContext实例变量,因此接下来可以通过该applicationContext实例变量来访问容器本身。

    工具使用

    SpringContextHolder.getBean("beanName");

    展开全文
  • 某些情况下我们要获取 IOC 容器中指定注解、类型、名字 Bean获取 IOC 容器中指定条件 Bean 可以通过 ApplicationContext 相应方法 @Autowired private ApplicationContext applicationContext; 获取指定...
  • 某些情况下我们要获取 IOC 容器中指定注解、类型、名字 Bean获取 IOC 容器中指定条件 Bean 可以通过 ApplicationContext 相应方法 @Autowired private ApplicationContext applicationContext; ...
  • SpringBoot在线程中获取容器中的Bean

    千次阅读 2016-10-17 13:16:23
    在 Servlet API 有一个 ServletContextListener 接口,它能够监听 ServletContext 对象生命周期,实际上就是监听 Web 应用生命周期。 当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent ...
  • 在Web应用中,Spring容器通常采用声明式方式配置产生:开发者只要在web.xml中配置一个Listener,该Listener将会负责初始化Spring容器,MVC框架可以直接调用Spring容器中的Bean,无需访问Spring容器本身。在这种情况...
  • 1.我们经常会发现在我们的service有注解而在dao上没有注解 看图 因为我们在spring容器初始化bean的...这里我自己理解一些那些算是spring的bean 。拿我们常用的springmvc框架来举例子。@controller 也是bean.
  • 源码分析:Spring是如何获取容器中的Bean

    千次阅读 多人点赞 2020-10-19 23:16:25
    我们把Bean交给Spring来管理,在我们需要对象时候Spring会自动帮我们注入,那Spring肯定会有一个从容器中获取Bean的过程,只不过这个过程是Spring框架来帮我们完成,对于我们使用者来说没有感知
  • 前言 前端时间写了一个单例,...1、先实现一个工具类,让它实现ApplicationContextAware接口,并通过@Component把它注入到容器,注入容器的时候,容器检查到该类实现了ApplicationContextAware,会自动调用setAppl...
  • 当时用springsecurity做动态加载权限时用到了鉴权(AccessDecisionVoter实现类),在这个类中没有办法获取ioc中的bean(不知道为啥),翻阅很多资料,找到一些解决办法和发现的一些问题记录下。 可以用到spring的...
  • web项目如何获取容器中的bean对象?

    千次阅读 2016-12-12 10:32:43
    spring通过在web.xml 配置ContextLoaderListener 来加载context配置文件,在DispatcherServlet也可以来加载...ContextLoaderListener加载context成功后,spring 将 applicationContext存放在ServletContextk

空空如也

1 2 3 4 5 ... 20
收藏数 2,569
精华内容 1,027
关键字:

获取容器中的bean