Spring注解的类如何在外部拿到?

图片说明

如图,想问问题:

Server作为第三方jar包的类,server.start()方法所需的参数是ServerListener类的实例。ServerListener类我在项目下已创建,里面的代码逻辑可忽略。


现在问题是如果再ServerListener类上@Component后,怎么改造server.start(new ServerListener())这行代码? 也就是说怎么从外部拿到这个类的实例呢?

谢谢。

1.如果你想用@autowired,那么这个类本身也应该是在spring的管理下 的,即你的UserLogUtil也要标注为一个component(或Service),这样spring才知道要注入依赖;
2. 如果不标注为@Component的话,此时不能通过@autowired来注入依赖,只能通过ApplicationContext来取得标注为Service的类:
UserLogService service = ApplicationContext.getBean(UserLogService.class);

如果你把这个类放入到IOC容器中了,就可以使用 ApplicationContext 获取 ; 可以新建一个类 实现ApplicationContextAware接口 , 就可以拿到ApplicationContext实例了 , 然后调用他的getBean方法即可;

/**

  • 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext.
  • @author Zaric
  • @date 2013-5-29 下午1:25:40
    */
    @Service
    @Lazy(false)
    public class SpringContextHolder implements ApplicationContextAware {

    private static ApplicationContext applicationContext = null;

    /**

    • 取得存储在静态变量中的ApplicationContext. */ public static ApplicationContext getApplicationContext() { return applicationContext; }

    /**

    • 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. */ @SuppressWarnings("unchecked") public static T getBean(String name) { return (T) applicationContext.getBean(name); }

    /**

    • 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. */ public static T getBean(Class requiredType) { return applicationContext.getBean(requiredType); }

    /**

    • 实现ApplicationContextAware接口, 注入Context到静态变量中.
      */
      @Override
      public void setApplicationContext(ApplicationContext applicationContext) {

      SpringContextHolder.applicationContext = applicationContext;
      }

}

使用注解 @Component之后 你需要配置spring进行注册(xml里面显式配置,或者配置为自动扫描),然后程序启动(初始化)完毕之后(注意程序启动顺序)再其他调用的地方可以使用 ApplicationContextAware接口(当然你要新建一个类(并自己管理这个类可以使用单例)来实现这个接口)然后通过getBean获取该bean