Spring factory bean with @Autowired in superclass

carcaret

I've implemented a factory bean in Spring to instantiate different subclasses of a superclass. The problem I have is that superclass properties aren't being @Autowired (I guess due to the new command in the factory methods). This is my code:

@Component
public class ConfigBeanImpl implements ConfigBean{

@Override
public String expandParam(String param) {
    return String.format("expanded %s", param);
}
}

public abstract class FactoryBean {

@Autowired
protected ConfigBean configBean;

private String property;

protected FactoryBean() {
    this.property = configBean.expandParam("property");
}

public abstract String getProperty();

public static FactoryBean GET(int id) {
    return new FactoryBeanGet(id);
}

public static FactoryBean POST(String param){
    return new FactoryBeanPost(param);
}
}

public class FactoryBeanGet extends FactoryBean {

private int id;

protected FactoryBeanGet(int id) {
    this.id = id;
}

@Override
public String getProperty() {
    return Integer.toString(id);
}
}

public class FactoryBeanPost extends FactoryBean {

private String param;

protected FactoryBeanPost(String param) {
    this.param = param;
}

@Override
public String getProperty() {
    return param;
}
}

public class Main {

public static void main(String[] args) {
    ApplicationContext context = 
               new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});

    FactoryBean bean = (FactoryBean) context.getBean("factoryBeanGet", 12);
    System.out.println(bean.getProperty());

    bean = (FactoryBean) context.getBean("factoryBeanPost", "test param");
    System.out.println(bean.getProperty());
}
}

And the applicationContext.xml:

<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">

<context:component-scan base-package="com.spring" />

<bean id="factoryBeanGet" scope="prototype" class="com.spring.bean.FactoryBean"
    factory-method="GET">
</bean>

<bean id="factoryBeanPost" scope="prototype" class="com.spring.bean.FactoryBean"
    factory-method="POST">
</bean>

The protected ConfigBean configBean property in abstract class FactoryBean isn't being @Autowired and hence is null and the constructor throws a NullPointerException. If I place it inside each of the subclasses, it works fine, but it'd be duplicated code. Is there a way to solve this or am I doing something wrong?

JB Nizet

Put yourself in Spring's shoes. It must instantiate FactoryBean, and then initialize its configBean field. So, the first thing it will do is call the constructor. And then, once the object exists, it will initialize the object's field. It obviously can't initialize the field if the object doesn't exist yet. So, at the time the constructor is called, the field is still null.

Use constructor injection, or use a method annotated witb @PostConstruct to call the configBean.

That said, the private property field that you're trying to initialize is not used anywhere, so you could as well remove it, and remove the configBean field as well.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Spring factory bean with @Autowired in superclass

From Dev

Spring bean created but not autowired

From Dev

Spring @Autowired - Instantiate new bean

From Dev

Jackson 2 and Spring Autowired bean

From Dev

Spring MVC add bean and autowired

From Dev

Spring @Autowired bean giving null

From Dev

Spring configuration - Autowired bean required?

From Dev

Spring Bean: Is autowired attribute initialised before constructor?

From Dev

Spring autowired bean causes null pointer

From Dev

Spring @Autowired bean not initialising; Null Pointer Exception

From Dev

Spring bean is created, but is null when Autowired

From Dev

Spring Autowiring a property within an autowired bean

From Dev

Spring @Autowired and bean declaration in applicationContext.xml

From Dev

Spring @Autowired gives null in a @Repository bean

From Dev

why is autowired bean null in filter in this spring application?

From Dev

Web Filter cannot autowired spring bean

From Dev

Spring @Autowired bean not found, No qualifying bean of type [...] found

From Dev

Spring - Inject bean from a factory class

From Dev

Query on Bean instantiation in spring and static factory

From Dev

Spring - Inject bean from a factory class

From Dev

What is the difference between spring factory-method and factory-bean?

From Dev

Using Spring Factory bean pattern - no bean return null?

From Dev

How to pass class constructor parameters in Spring bean Autowired by annotations

From Dev

Spring-integration gateway cannot be autowired, no qualifying bean found

From Dev

Could private static class Spring bean annotated @Service be autowired?

From Dev

How to create a mock spring bean for a class having autowired dependencies

From Dev

Vaadin 7 + Spring + VaadinSpringIntegration Add-on - Autowired bean is null

From Dev

Why do I not need @Autowired on @Bean methods in a Spring configuration class?

From Dev

Spring Couldn't autowired,there is more than one bean of `` type

Related Related

  1. 1

    Spring factory bean with @Autowired in superclass

  2. 2

    Spring bean created but not autowired

  3. 3

    Spring @Autowired - Instantiate new bean

  4. 4

    Jackson 2 and Spring Autowired bean

  5. 5

    Spring MVC add bean and autowired

  6. 6

    Spring @Autowired bean giving null

  7. 7

    Spring configuration - Autowired bean required?

  8. 8

    Spring Bean: Is autowired attribute initialised before constructor?

  9. 9

    Spring autowired bean causes null pointer

  10. 10

    Spring @Autowired bean not initialising; Null Pointer Exception

  11. 11

    Spring bean is created, but is null when Autowired

  12. 12

    Spring Autowiring a property within an autowired bean

  13. 13

    Spring @Autowired and bean declaration in applicationContext.xml

  14. 14

    Spring @Autowired gives null in a @Repository bean

  15. 15

    why is autowired bean null in filter in this spring application?

  16. 16

    Web Filter cannot autowired spring bean

  17. 17

    Spring @Autowired bean not found, No qualifying bean of type [...] found

  18. 18

    Spring - Inject bean from a factory class

  19. 19

    Query on Bean instantiation in spring and static factory

  20. 20

    Spring - Inject bean from a factory class

  21. 21

    What is the difference between spring factory-method and factory-bean?

  22. 22

    Using Spring Factory bean pattern - no bean return null?

  23. 23

    How to pass class constructor parameters in Spring bean Autowired by annotations

  24. 24

    Spring-integration gateway cannot be autowired, no qualifying bean found

  25. 25

    Could private static class Spring bean annotated @Service be autowired?

  26. 26

    How to create a mock spring bean for a class having autowired dependencies

  27. 27

    Vaadin 7 + Spring + VaadinSpringIntegration Add-on - Autowired bean is null

  28. 28

    Why do I not need @Autowired on @Bean methods in a Spring configuration class?

  29. 29

    Spring Couldn't autowired,there is more than one bean of `` type

HotTag

Archive