《Spring框架IOC容器笔记---动力节点》


第一个Spring项目
步骤:
1、新建java project
2、导入必备的jar
1>spring的核心:spring-beans.jar,spring-core.jar,spring-context.jar,spring-expression.jar
2>日志:commons-logging.jar
可选的有日志实现:log4j.jar 单元测试:junit.jar
3、定义接口和实现类,与没有使用框架一样定义
4、定义spring的配置文件
1>加入约束文件spring-beans.xsd
2>声明bean对象,即java对象
试想,如何让Spring知道你声明了SomeServiceImpl类,然后去创建对象呢?不管IOC是DL或者是DI方式实现,配置文件都是必不可少的。一般都是用applicationContext.xml命名,applicationContext.xml的配置参考xsd-config.html
拷贝这一段到applicationContext.xml
5、定义测试类,在代码中使用spring,需要创建接口ApplicationContext,表示spring框架。
< bean id = “someService” class=“com.bjpowernode.service.SomeServiceImpl” > < /bean>的作用就相当于
SomeService someService = new com.bjpowernode.service.SomeServiceImpl();
main函数获取bean对象测试:注意此时我的applicationContext.xml放在src下的根目录,所以直接使用ClassPathXmlApplicationContext创建ApplicationContext。若applicationContext.xml放在某个磁盘目录,则用FileSystemXmlApplicationContext创建。
若applicationContext.xml直接放在项目的根目录下,即和src是同级,需要使用FileSystemXmlApplicationContext读取配置文件
getBean()源码分析
右键getBean open Implementation,跑到AbstractBeanFactory中查看源码,
查看getBean
可以发现bean是getObjectForBeanInstance获得然后返回的
getObjectForBeanInstance中调用了getObjectFromFactoryBean,而getObjectFromFactoryBean中object是从FactoryBeanRegistrySupport中的factoryBeanObjectCache中get得到的。
而果然,factoryBeanObjectCache是一个Map,并且是一个ConcurrentHashMap。
关键结论:我们从容器中获取一个bean对象用applicationContext的对象的getBean(“bean的id名”)方法实现,获取bean对象是BeanFactory类通过工厂模式实现,所有的bean对象其实都放在一个ConcurrentHashMap中,getBean其实就是从这个Map中getObject,这也就是为什么applicationContext.xml中的bean id名必须唯一的原因。
在创建ApplicationContext容器时会创建所有配置文件中的 bean对象
在SomeServiceImpl中添加无参构造函数。
测试ApplicationContext容器创建时,bean对象已经创建了。
并且是一个bean标签会创建一个对象,例如新增一个bean标签
再次运行,你会发现无参构造器被执行了两次,说明创建了两个对象。
同时,可以获取容器关于bean对象的信息
非联网下的约束文件的配置
spring的约束文件用于作为数据标签属性的验证。联网情况下会自动下载xsd约束文件。
本地中在:spring-framework-4.0.0.RELEASE\schema\beans中
复制http://www.springframework.org/schema/beans/spring-beans.xsd ,然后到windows–perference–xml catalog中添加,并指定本地的xsd
此时你打一个<就会有提示: