将一个对象放到 Spring 容器中,其实就是将对象交给 Spring 容器管理,这里有三种方式可以将一个对象交给 Spring 进行管理
@Compont 是指将一个类交给 Spring 进行管理,Spring 会根据这个类,自己创建对象,由 Spring 控制产生过程
自己将对象交给 Spring 管理的好处是,可以自己控制对象的产生过程,比如说将某个对象进行加强(代理对象)
使用 @Bean 注解
使用 @Bean 也可以将 对象交给 Spring 容器进行管理,常见的一些我们利用 @Bean 进行一些连接池的配置,主要是为了零配置使用
@Bean
public JedisPool jedisPool() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(redisMaxIdle);
jedisPoolConfig.setMinIdle(redisMinIdle);
jedisPoolConfig.setMaxWaitMillis(redisMaxWait);
jedisPoolConfig.setTestOnBorrow(false);
jedisPoolConfig.setTestOnReturn(false);
jedisPoolConfig.setTestOnCreate(false);
if (password == null || password.equals(""))
return new JedisPool(jedisPoolConfig, redisHost, redisPort, timeout);
return new JedisPool(jedisPoolConfig, redisHost, redisPort, timeout, password);
}
使用 FactoryBean
通过 FactoryBean 可以控制 bean 的生产过程,主要是为了与第三方集成
@Component
public class MyFactoryBean implements FactoryBean<TestBean> {
@Override
public TestBean getObject() throws Exception {
return new TestBean();
}
@Override
public Class<?> getObjectType() {
return TestBean.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
使用 FactoryBean 的时候,当直接使用 getBean(“myFactoryBean”) 返回的是 getObject 返回的对象,如果想拿到 myFactoryBean 对象,需要前面加一个 “&” 符号,如:getBean(“&myFactoryBean”)
System.out.println(ac.getBean("myFactoryBean")); // TestBean@23fe1d71
System.out.println(ac.getBean("&myFactoryBean")); // MyFactoryBean@28ac3dc3
利用容器提供的 API
利用 AnnotationConfigApplicationContext 获取 beanFactory,注册一个单例 bean,这种方法有一定的局限性,如:下面的代码,此时虽然将 myService 放到了 Spring 的容器中,但是其他对象并不能注入这个 bean,因为 Spring 容器已经完成了注册
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
ac.register(AppConfig.class);
ac.refresh();
ac.getBeanFactory().registerSingleton("myService", MyService.class);
那么如何才能让其他对象注入这个 bean 呢?
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
ac.getBeanFactory().registerSingleton("myService", MyService.class);
ac.register(AppConfig.class);
ac.refresh();
这样其他对象就可以依赖这个 bean 了,但是问题又来了,在注册这个 bean 的时候,其他对象并没有被 Spring 容器进行扫描,所以 myService 这个对象也就无法依赖其他对象(除非我们自己维护好这个对象的所有依赖关系)所以说这个方法是比较鸡肋的