`

new 出的对象,无法调用@Autowired进入的spring bean

 
阅读更多

一不小心进了这个坑   记录一下

 

 

@Autowired来的spring 下的bean,则当前类必须也是spring bean才能调用它,不能用new Xxx()来获得对象,这种方式获得的对象无法调用其内的@autowired的bean

1. 类1
加入spring pool
public class PersonServiceImpl implements PersonService{

    public void save(){
        System.out.println("This is save for test spring");
    }

    public List<String> findAll(){
        List<String> retList = new ArrayList<String>();
        for(int i=1;i<10;i++){
            retList.add("test"+i);
        }
        return retList;
        
    }
}

加入spring pool
<bean id="personServiceImpl" class="com.machome.testtip.impl.PersonServiceImpl" >        
</bean>
2.类2
autowired类1, 并且也加入spring pool
public class ProxyPServiceImpl implements ProxyPService {
   
    public void save(){
        System.out.print("this is proxy say:");
        personService.save();
    }

    public List<String> findAll(){
        System.out.print("this is proxy say:");
        return personService.findAll();
    }
    
    @Autowired
    PersonService personService;
   
}
3.直接new类2,则执行其方法时出null pointer错误 ProxyPService  proxyPService = new ProxyPServiceImpl();
proxyPService.save();

执行报错:
java.lang.NullPointerException
    at com.machome.testtip.impl.ProxyPServiceImpl.save(ProxyPServiceImpl.java:18)
    at com.machome.testtip.TestSpring2.testSave(TestSpring2.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
4.解决:用spring 方式获取类2的bean,再执行其方法,没问题 ProxyPService  proxyPService = null;
try {
                String[] confFile = {"spring.xml"};
                ctx = new ClassPathXmlApplicationContext(confFile);
                proxyPService = (ProxyPService)ctx.getBean("ProxyPServiceImpl");
            } catch (Exception e) {
                e.printStackTrace();
            }
proxyPService.save();

执行:
this is proxy say:This is save for test spring

 

分享到:
评论

相关推荐

    详解SpringBoot 多线程处理任务 无法@Autowired注入bean问题解决

    在 SpringBoot 多线程处理任务中无法使用 @Autowired 注入 bean 的问题,可以通过创建一个工具类来解决,这个工具类可以用于获取 bean 对象,从而解决多线程处理任务中无法使用 @Autowired 注入 bean 的问题。

    Spring使用@Autowired注解自动装配

    `@Autowired`是Spring框架的一部分,它用于自动将依赖对象注入到需要它们的bean中。这个注解基于类型匹配,Spring会尝试找到类型匹配的bean并将其注入到目标字段或方法中。如果存在多个候选bean,可以通过指定`@...

    SSH笔记-通过@Autowired配置注入关系

    在Spring框架中,`@Autowired`注解是一个关键特性,用于自动装配Bean的依赖。它极大地简化了传统XML配置中的bean依赖注入过程。本笔记将深入探讨如何在Spring 4中利用`@Autowired`注解配置注入关系,以及它与前一篇...

    BeanPostProcessor实现注入的@Autowired注入的对象是增强的代理对象.rar

    当我们谈论"BeanPostProcessor实现注入的@Autowired注入的对象是增强的代理对象"时,实际上是在讨论如何通过`BeanPostProcessor`来对`@Autowired`注入的bean进行代理增强。 首先,让我们了解`@Autowired`注解的工作...

    Spring Ioc源码分析系列--@Autowired注解的实现原理.doc

    首先,它会对标注了 @Autowired 的 Bean 进行预处理,然后调用 postProcessProperties() 方法将依赖的 Bean 实例注入到目标 Bean 中。 在预处理阶段,AutowiredAnnotationBeanPostProcessor 会对 Bean 的定义进行...

    Spring @Autowired

    在Java的Spring框架中,`@Autowired`是一个关键的依赖注入(Dependency Injection,简称DI)注解,它允许开发者自动装配Bean的依赖,无需手动设置属性或者调用构造函数。这个注解是Spring框架的核心特性之一,极大地...

    @Autowired 注解是如何实现的?(csdn)————程序.pdf

    - 如果还是无法确定,Spring会抛出异常,表示无法解析依赖。 4. **依赖注入**:一旦找到了合适的Bean,Spring就会调用相应的方法(构造函数、setter或字段)来注入这个Bean。 5. **处理未指定类型的依赖**:如果...

    Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)

    Spring框架的@Autowired自动装配是其依赖注入(Dependency Injection, DI)机制的核心部分,它极大地简化了Java应用的组件装配和管理。本篇文章将深入探讨@Autowired的XML版本、Annotation版本以及源码层面的理解,...

    HibernateDaoSupport 与@Autowired

    在实际开发中,结合使用`HibernateDaoSupport`和`@Autowired`,我们可以快速构建出健壮且易于维护的DAO层,同时充分利用Spring的IoC容器提供的各种优势。对于`自定义HibernateDaoSupport`这个文件,可能包含了开发者...

    普通类调用Spring bean对象

    当我们需要在非Spring管理的普通类中调用Spring管理的bean对象时,需要掌握特定的方法。这篇文档将详细介绍如何实现这一操作,并探讨相关的源码和技术工具。 首先,理解Spring的核心概念——依赖注入(Dependency ...

    详解Spring @Autowired 注入小技巧

    Spring @Autowired 注入小技巧 在 Spring 框架中,@Autowired 注解是用来实现自动依赖注入的。它可以根据类型(Type)进行自动注入,并且默认注入的 bean 为单例(SingleTon)的。下面我们来详解一些 @Autowired ...

    Spring框架中 @Autowired 和 @Resource 注解的区别

    当在字段或方法上使用`@Autowired`时,Spring会查找与该字段或方法参数类型相匹配的Bean,并将其注入。如果找到多个匹配的Bean,可以通过提供`@Qualifier`注解来指定特定的Bean。如果没有任何匹配的Bean,Spring会抛...

    你所不知道的Spring的@Autowired实现细节分析

    在Spring容器初始化Bean时,会调用一系列实现了`BeanPostProcessor`接口的类。`BeanPostProcessor`接口提供了一种后置处理机制,允许在Bean实例化前后进行自定义操作。`AutowiredAnnotationBeanPostProcessor`是专门...

    17. Spring Boot普通类调用bean【从零开始学Spring Boot】

    在Spring Boot框架中,普通类调用bean是常见的操作,特别是在构建复杂应用时。这篇博客“17. Spring Boot普通类调用bean【从零开始学Spring Boot】”旨在指导初学者如何在非Spring管理的类中访问和使用Spring容器中...

    关于spring boot中几种注入方法的一些个人看法

    在启动 Spring IoC 时,容器自动装载了一个 AutowiredAnnotationBeanPostProcessor 后置处理器,当容器扫描到 @Autowired、@Resource 或 @Inject 时,就会在 IoC 容器自动查找需要的 bean,并装配给该对象的属性。...

    spring3注解详细

    当有多个相同类型的 Bean 时,@Autowired 会抛出 BeanCreationException。此时可以结合 @Qualifier 注解来指定特定的 Bean,例如: ```java @Autowired @Qualifier("userServiceImpl") public IUserService ...

    解决Springboot @Autowired 无法注入问题

    4. `@Autowired`的可选性:默认情况下,`@Autowired`是非必需的,如果找不到匹配的bean,Spring会抛出异常。你可以通过设置`@Autowired(required=false)`让它成为可选的。 5. Spring配置问题:检查`application....

    spring bean的生命周期

    - **XML配置**:在传统的Spring应用中,Bean的定义通常写在XML配置文件中,如`springbean-xml`中的配置。 - **注解配置**:使用`@Component`,`@Service`,`@Repository`和`@Controller`注解标记类,配合`@...

    spring-autowire.zip

    此外,我们还可以在构造器中使用@Autowired,这样在实例化Person时,Spring就会自动调用带参数的构造器,并注入对应的bean。对于没有匹配类型的bean,Spring会抛出异常。如果希望在找不到匹配bean时使用null或者...

Global site tag (gtag.js) - Google Analytics