在spring中实例化bean无效的问题

目录
  • spring中实例化bean无效
    • Action中代码如下
    • applicationContext.xml中配置如下
  • spring实例化bean顺序问题,导致注入失败
    • 问题如下
    • 原因
    • 解决

spring中实例化bean无效

在做Struts2和Spring整合时遇到Spring实例化无效的情况,

Action中代码如下

public class UserAction extends ActionSupport {
    @Resource
    private UserService userService;
    public String execute(){
        //userService.saveUser(new Object());
        System.out.println(userService);
        System.out.println("struts2spring整合成功");
        return "success";
    }
}

applicationContext.xml中配置如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    <!-- 自动扫描与装配bean -->
    <context:component-scan base-package="com.bjwl"></context:component-scan>
</beans>

通过注解实例化UserService时一直得到的是null。最后经过查找,发现没有导入Struts2-Spring-plugin.jar的原因。

spring实例化bean顺序问题,导致注入失败

我们可以通过Spring进行非常方便的管理bean,只需要在类上面加一个注解就可以进行bean的注入,也就是所谓的DI。今天碰到了个小问题,来总结一下。

问题如下

public abstract class TestBean {
    public String str;
    
    public TestBean(){
        this.str = initStr();
    }
    
    protected abstract String initStr();
}
public class TestSon extends TestBean {
    @Resource
    public String str;
    @Override
    protected String initStr() {
        return this.str;
    }
}

但是发现这个str始终是null。

原因

在实例化TestBean的时候不能确认str已经实例化,所以是先建立对象,再进行注入str的值。那么创建对象的时候,根据构造方法创建的对象中,还没有注入str的值,所以只能为null。

解决

我们需要确认在str已经注入进来的情况下再对父类中的str赋值,那么这个时候需要子类实现 InitializingBean 这个接口,实现其中的afterPropertiesSet()

public class TestSon extends TestBean implements InitializingBean
{
    @Resource
    public String str;
    @Override
    protected String initStr() {
        return this.str;
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        super.str = this.str;
    }
}

问题成功解决。注入成功

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 这一次搞懂Spring的Bean实例化原理操作

    前言 前两篇文章分析了Spring XML和注解的解析原理,并将其封装为BeanDefinition对象存放到IOC容器中,而这些只是refresh方法中的其中一个步骤--obtainFreshBeanFactory,接下来就将围绕着这些BeanDefinition对象进行一系列的处理,如BeanDefinitionRegistryPostProcessor对象方法的调用.BeanFactoryPostProcessor对象方法的调用以及Bean实例的创建都离不开这些BeanDefinition

  • Spring Bean实例化实现过程解析

    这篇文章主要介绍了Spring Bean实例化实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Bean的实例化 1.构造器实例化:Spring容器通过Bean对应类中默认的无参构造方法来实例化Bean package com.itheima.instance.constructor; public class Bean1 { } <?xml version="1.0" encoding="UTF-8&quo

  • 基于springboot bean的实例化过程和属性注入过程

    目录 bean的实例化过程和属性注入过程 bean实例化流程说明 bean的实例化过程和属性注入过程 了解过springboot的加载流程的都知道springboot初始化bean都在refresh方法中. 这个方法代码如下: // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory.新建beanFactory Config

  • Spring bean对象实例化实现过程图解

    好了 我们聊聊 Bean 的实例化过程的几个重要角色 BeanDefinitionRegistryPostProcessor 接口 Refresh().invokeBeanFactoryPostProcessors 这个方法里面. BeanDefinitionRegistryPostProcessor 这个接口的调用分为三部: 1.调用实现了 PriorityOrdered 排序接口 2.调用实现了 Ordered 排序接口 3.没有实现接口的调用 这个接口我的理解:获取 BeanDefinit

  • Spring Bean的实例化之属性注入源码剖析过程

    前言 这一章节我们来讨论创建Bean过程中的属性注入,在Spring的IOC容器启动过程中,会把定义的Bean封装成BeanDefinition注册到一个ConcurrentHashMap中,Bean注册完成后,就会对单利的且lazy-init=false 的Bean进行实例化.创建Bean的代码在 AbstractAutowireCapableBeanFactory#doCreateBean 中,当Bean创建成功之后,会调用AbstractAutowireCapableBeanFactory

  • Spring bean的实例化和IOC依赖注入详解

    前言 我们知道,IOC是Spring的核心.它来负责控制对象的生命周期和对象间的关系. 举个例子,我们如何来找对象的呢?常见的情况是,在路上要到处去看哪个MM既漂亮身材又好,符合我们的口味.就打听她们的电话号码,制造关联想办法认识她们,然后...这里省略N步,最后谈恋爱结婚. IOC在这里就像婚介所,里面有很多适婚男女的资料,如果你有需求,直接告诉它你需要个什么样的女朋友就好了.它会给我们提供一个MM,直接谈恋爱结婚,完美! 下面就来看Spring是如何生成并管理这些对象的呢? 1.方法入口 o

  • 介绍下Java Spring的核心接口,容器中Bean的实例化

    目录 Spring的核心接口 ApplicationContext接口 BeanFactory接口 Spring容器中Bean的实例化 构造方法 无参构造方法 有参构造方法 工厂 静态工厂 实例工厂 FactoryBean→使用工厂方法 总结 Spring的核心接口 ApplicationContext接口 继承了BeanFactory并且提供了加载资源文件的方法 ApplicationContext其实就是一个容器,ApplicationContext的实例其实就是容器对象,这个容器对象在实例

  • 在spring中实例化bean无效的问题

    目录 spring中实例化bean无效 Action中代码如下 applicationContext.xml中配置如下 spring实例化bean顺序问题,导致注入失败 问题如下 原因 解决 spring中实例化bean无效 在做Struts2和Spring整合时遇到Spring实例化无效的情况, Action中代码如下 public class UserAction extends ActionSupport {     @Resource     private UserService us

  • Spring中实例化bean的四种方式详解

    前言 在介绍Bean的实例化的方式之前,我们首先需要介绍一下什么是Bean,以及Bean的配置方式. 如果把Spring看作一个大型工厂,那么Spring容器中的Bean就是该工厂的产品.要想使用Spring工厂生产和管理Bean,就需要在配置文件中指明需要哪些Bean,以及需要使用何种方式将这些Bean装配到一起. Spring容器支持两种格式的配置文件,分别为Properties文件格式和xml文件格式,而在实际的开发当中,最常使用的额是xml文件格式,因此在如下的讲解中,我们以xml文件格

  • 解决Spring在Thread中注入Bean无效的问题

    目录 在Thread中注入Bean无效 错误的注入方法 通过封装Thread子类注入 通过外部引入 Spring多线程中bean的注入问题 网上的主要解决方法有 在Thread中注入Bean无效 在Spring项目中,有时需要新开线程完成一些复杂任务,而线程中可能需要注入一些服务.而通过Spring注入来管理和使用服务是较为合理的方式.但是若直接在Thread子类中通过注解方式注入Bean是无效的. 因为Spring本身默认Bean为单例模式构建,同时是非线程安全的,因此禁止了在Thread子类

  • Spring中的bean概念介绍

    目录 1 定义 2 控制反转(IoC) 2.1 私有属性保存依赖 2.2 让Spring控制类构建过程 2.3 这就是IoC 3 Bean? Bean是Spring框架中最核心的两个概念之一(另一个是面向切面编程AOP). 1 定义 Spring 官方文档对 bean 的解释是:In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC conta

  • 一文搞懂Spring中的Bean作用域

    目录 概述 Singleton prototype request session application 概述 scope用来声明容器中的对象所应该处的限定场景或者说该对象的存活时间,即容器在对象进入其 相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象. Spring容器bean的作用域类型: singleton:Spring IoC 容器的单个对象实例作用域都默认为singleton prototype:针对声明为拥有prototyp

  • Spring createBeanInstance实例化Bean

    目录 Spring实例Bean的方法 一.determineConstructorsFromBeanPostProcessors:确定构造参数 二.autowireConstructor:有参构造创建Bean 2.1 resolveConstructorArguments:解析参数并返回最小参数个数 2.2 createArgumentArray:创建构造参数数组 2.3 instantiate:实例化Bean 三.instantiateBean:无参构造创建Bean 无参构造 四.使用实例化策

  • 写了两年代码之后再来谈一谈Spring中的Bean

    目录 (一)什么是Bean (二)如何往Spring容器中添加Bean (三)Bean的作用域 (四)Bean的常用注解 4.1 Conditional 4.2 ComponentScan 4.3 @Import (五)Bean的初始化和销毁 1.自定义初始化方法和销毁方法 2.通过 InitializingBean, DisposableBean 接口实现 3.BeanPostProcessor (六)总结 (一)什么是Bean Spring中的Bean简单来讲就是一个个被Spring容器管理

  • Spring中为bean指定InitMethod和DestroyMethod的执行方法

    1.创建一个类 /** * @author: zhaobin * @date: 2021/11/25 10:16 * @description: */ public class Cat { public Cat(){ System.out.println("先初始化构造器"); } public void start(){ System.out.println("start方法"); } public void destroy(){ System.out.print

  • 面试Spring中的bean线程是否安全及原因

    目录 SpringBean作用域 spring单例,为什么controller.service和dao确能保证线程安全? 总结 面试官经常喜欢问Spring中的bean是不是线程安全的这个问题用来考察对Spring  中Bean作用域的理解,先说结论,Spring中的Bean不是线程安全的. Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究. Spr

  • Spring中bean的继承与抽象代码示例

    我们在应用Spring时,在一般的设计时,肯定要用的抽象类.那在Spring中怎么样配置这些抽象Bean呢.请看下面: 如果两个bean 之间的配置信息非常相似,可利用继承来减少重复配置工作. 继承是指子bean 定义可从父bean 定义继承部分配置信息,也可覆盖特定的配置信息,或者添加一些配置.使用继承配置可以节省很多的配置工作.在实际应用中,通用配置会被配置成模板,可供子bean 继承. 使用abstract 属性 正如前面所介绍的,通用的配置会被配置成模板,而模板不需要实例化,仅仅作为子b

随机推荐