额外说明:虽然原书中并未提及setFactory()方法的调用时机,但是可以猜想到,这个方法可能是在根据某个配置文件创建了一个新工厂之后,Spring才调用这个方法,并把通达信行情接口dll编程,beanFactory注入到通达信行情接口dll编程,bean中。
但是有言在先,如果要在Spring容器中做到这两点,可以自己通过某些方法实现,代价是大量冗余代码,好处是跟Spring解耦。如果使用Spring提供的接口,好处当然减少代码的规模,“缺点”是与Spring耦合。总之,无论采取那种办法还是要看实际需要。
作用:让Bean获取自己在BeanFactory配置中的名字。
补充说明:factory.preInstantiateSingletons();方法。preInstantiateSingletons()方法立即实例化所有的Bean实例,有必要对这个方法和Spring加载bean的机制做个简单说明。方法本身的目的是让Spring立即处理工厂中所有Bean的定义,并且将这些Bean全部实例化。因为Spring默认实例化Bean的情况下,采用的是lazy机制,换言之,如果不通过getBean()方法获取Bean的话,那么为了节省内存将不实例话Bean,只有在Bean被调用的时候才实例化他们。
额外说明:Spring自动调用。并且会在Spring自身完成Bean配置之后,且在调用任何Bean生命周期回调方法之前就调用这个方法。换言之,在程序中使用BeanFactory.getBean(StringbeanNam之前,Bean的名字就已经设定好了。程序中可以尽情的使用BeanName而不用担心它没有被初始化。
让Bean对工厂有知觉
通常都是为了更好的饿配置Log,但是请注意,不要只是因为配合Log就把bean那么中添加任何业务含义,否则会让你自己的类关联到某个Spring特性上去,而它带来的好处却是微不足道的。如果确实需要Bean带有某种内部名称,那么最好让Bean自己实现某个方法,例如setName(),然后使用DI给每个Bean注入一个名字,这样技能保持配置Bean的名字仍然能够简洁,且你也无需修改自己的配置文件,好让Bean的名字带有业务含义。
例程如下publicclassLogginBeanimplementsBeanNameAware{privateStringbeanName=null;publicvoidsetBeanName(StringbeanNam{this.beanName=beanName;}}
实现:通过实现BeanNameAware接口,接口中就一个方法setBeanName()
Bean之中一定要有个String类型变量来保存BeanName的值,这个是在编写Bean代码时有程序员手工完成的,而不是通过什么特殊的饿配置。
/让Bean对Name有知觉/
作用:让Bean获取配置他们的BeanFactory的引用。
实现:实现BeanFactoryAware接口,其中只有一个方法即setFactory(BeanFactoryfactory)。使用上与BeanNameAware接口无异,只不过BeanFactoryAware注入的是个工厂,BeanNameAware注入的是个Bean的名字。
让bean获取配置自己的工厂之后,当然可以在Bean中使用这个工厂的getBean()方法,实际上非常不推荐这样做,因为结果是进一步加大Bean与Spring的耦合,能通过DI注入进来的尽量通过DI来注入。
文章为作者独立观点,不代表股票交易接口观点