Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Bean Annotation with no XML

I am doing my best to use little to no XML here. I have made a very simple program but it is not working. Hoping someone could help me out.

public class App {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new    
AnnotationConfigApplicationContext(Logger.class);

        Logger logger = ctx.getBean(Logger.class);

        logger.writeConsole("Hello there");
        logger.writeFile("Hi again");

        ctx.close();
    }

}

Interface

public interface LogWriter {
    public void write(String text);
}

FileWriter

public class FileWriter implements LogWriter {

    public void write(String text) {

    System.out.println("FileWriter: " + text);

   }

}

ConsoleWriter

 public class ConsoleWriter implements LogWriter{

      public void write(String text) {
      System.out.println("Console Writer: "+text);

   }

}

Logger

public class Logger {

@Autowired
private ConsoleWriter consoleWriter;
@Autowired
private FileWriter fileWriter;

public void setConsoleWriter(ConsoleWriter consoleWriter) {
    this.consoleWriter = consoleWriter;
}

public void setFileWriter(FileWriter fileWriter) {
    this.fileWriter = fileWriter;
}


public void writeFile(String text) {
    fileWriter.write(text);
}

public void writeConsole(String text) {
    consoleWriter.write(text);
}

@Bean
public Logger getLogger(){
    return new Logger();
    }

}

Error

Jul 02, 2015 2:52:49 PM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@246b179d: startup date [Thu Jul 02 14:52:49 CEST 2015]; root of context hierarchy
Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.core.GenericTypeResolver.resolveReturnTypeForGenericMethod(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Class;
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:650)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:575)
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1344)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:356)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:327)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:644)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:73)
    at com.main.application.App.main(App.java:10)

This is my XML file but I am trying to get away from using XML and just annotations so I made this simple to understand program as practice.

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


    <context:annotation-config></context:annotation-config>

</beans>
like image 317
Mike3355 Avatar asked Jan 09 '23 01:01

Mike3355


2 Answers

This would do without any xml configuration

public class App {

 public static void main(String[] args) {

  ApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);

  Logger logger = ctx.getBean(Logger.class);
  logger.writeConsole("Hello there");
  logger.writeFile("Hi again");
 }
}

Config class

@Configuration
@ComponentScan
public class Config {
}

Console Writer

@Component
public class ConsoleWriter implements LogWriter{

  public void write(String text) {
      System.out.println("Console Writer: "+text);

  }
}

FileWriter

@Component
public class FileWriter implements LogWriter {
   public void write(String text) {
      System.out.println("FileWriter: " + text);
   }
}

Looger

@Component
public class Logger {

@Autowired
private ConsoleWriter consoleWriter;
@Autowired
private FileWriter fileWriter;

public void setConsoleWriter(ConsoleWriter consoleWriter) {
    this.consoleWriter = consoleWriter;
}

public void setFileWriter(FileWriter fileWriter) {
    this.fileWriter = fileWriter;
}


public void writeFile(String text) {
    fileWriter.write(text);
}

public void writeConsole(String text) {
    consoleWriter.write(text);
}

}

Interface LogWriter

public interface LogWriter {

  public void write(String text);

}
like image 157
Ricardo Avatar answered Jan 10 '23 14:01

Ricardo


Assuming you are using Spring 3.2. Your App.java should look like this:

@Configuration
@ComponentScan
public class App {

  public static void main(String[] args) {
    AnnotationConfigApplicationContext ctx = new    
            AnnotationConfigApplicationContext(App.class);

    Logger logger = ctx.getBean(Logger.class);

    logger.writeConsole("Hello there");
    logger.writeFile("Hi again");

    ctx.close();
  }

}

@Configuration: tells Spring that this class is a configuration Class

@ComponentScan: tells Spring to scan all classes from that package.

No more needs of xml with that starting point.

FileWriter, ConsoleWriter and Logger are Components. When you define Components you can use @Autowired annotation on those classes. You need to add the @Component annotation on these Classes.

Note that @Bean getLogger() method will make an exception on runtime because Spring will find two definitions with name "logger". So to make your application run correctly you need to remove that method.

like image 32
bodyjares Avatar answered Jan 10 '23 16:01

bodyjares