将一个对象放到 Spring 容器中,其实就是将对象交给 Spring 容器管理,这里有三种方式可以将一个对象交给 Spring 进行管理

@Compont 是指将一个类交给 Spring 进行管理,Spring 会根据这个类,自己创建对象,由 Spring 控制产生过程

自己将对象交给 Spring 管理的好处是,可以自己控制对象的产生过程,比如说将某个对象进行加强(代理对象)

使用 @Bean 注解

使用 @Bean 也可以将 对象交给 Spring 容器进行管理,常见的一些我们利用 @Bean 进行一些连接池的配置,主要是为了零配置使用

  1. @Bean
  2. public JedisPool jedisPool() {
  3. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  4. jedisPoolConfig.setMaxIdle(redisMaxIdle);
  5. jedisPoolConfig.setMinIdle(redisMinIdle);
  6. jedisPoolConfig.setMaxWaitMillis(redisMaxWait);
  7. jedisPoolConfig.setTestOnBorrow(false);
  8. jedisPoolConfig.setTestOnReturn(false);
  9. jedisPoolConfig.setTestOnCreate(false);
  10. if (password == null || password.equals(""))
  11. return new JedisPool(jedisPoolConfig, redisHost, redisPort, timeout);
  12. return new JedisPool(jedisPoolConfig, redisHost, redisPort, timeout, password);
  13. }

使用 FactoryBean

通过 FactoryBean 可以控制 bean 的生产过程,主要是为了与第三方集成

  1. @Component
  2. public class MyFactoryBean implements FactoryBean<TestBean> {
  3. @Override
  4. public TestBean getObject() throws Exception {
  5. return new TestBean();
  6. }
  7. @Override
  8. public Class<?> getObjectType() {
  9. return TestBean.class;
  10. }
  11. @Override
  12. public boolean isSingleton() {
  13. return true;
  14. }
  15. }

使用 FactoryBean 的时候,当直接使用 getBean(“myFactoryBean”) 返回的是 getObject 返回的对象,如果想拿到 myFactoryBean 对象,需要前面加一个 “&” 符号,如:getBean(“&myFactoryBean”)

  1. System.out.println(ac.getBean("myFactoryBean")); // TestBean@23fe1d71
  2. System.out.println(ac.getBean("&myFactoryBean")); // MyFactoryBean@28ac3dc3

利用容器提供的 API

利用 AnnotationConfigApplicationContext 获取 beanFactory,注册一个单例 bean,这种方法有一定的局限性,如:下面的代码,此时虽然将 myService 放到了 Spring 的容器中,但是其他对象并不能注入这个 bean,因为 Spring 容器已经完成了注册

  1. AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
  2. ac.register(AppConfig.class);
  3. ac.refresh();
  4. ac.getBeanFactory().registerSingleton("myService", MyService.class);

那么如何才能让其他对象注入这个 bean 呢?

  1. AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
  2. ac.getBeanFactory().registerSingleton("myService", MyService.class);
  3. ac.register(AppConfig.class);
  4. ac.refresh();

这样其他对象就可以依赖这个 bean 了,但是问题又来了,在注册这个 bean 的时候,其他对象并没有被 Spring 容器进行扫描,所以 myService 这个对象也就无法依赖其他对象(除非我们自己维护好这个对象的所有依赖关系)所以说这个方法是比较鸡肋的