Spring学习之路(一)
1.为什么要在程序开发中使用Spring框架?
首先,Spring是于2003年兴起的一个轻量级的Java开源框架,Spring是为了解决企业应用开发的复杂性而创建的。它使用基本的JavaBean来完成以前只可能由EJB完成的事情,但Spring的用途不局限于服务器端的开发。在这里引入两个概念:耦合性、侵入性
在传统的Java开发中具有高度的耦合性和侵入性。在一个项目中,一般一个类往往需要依赖很多其他类来完成操作,Spring就是用来处理对象的创建/以及对象间依赖的一个开发框架,我们不再需要使用new关键字来在具体类中创建具体对象,而是将对象的创建交给Spring去完成,从而实现低耦合和非侵入式。
- 侵入式设计:对现有类的结构有影响,即需要实现或继承某些特定类。 如Struts框架。
- 非侵入式设计:引入了框架,对现有的类结构没有影响。如Spring框架/Hibernate框架。
至此,我们了解了为何要在开发中使用Spring框架
2.IoC和DI
在Spring中有两个重要思想,一个是IOC(Inversion On Control,简称IOC,即控制反转),一个是DI(dependency injection,简称DI,即依赖注入)
2.1IoC
IoC即控制反转,他是一种设计思想。将对象的创建交给外部容器自动自动完成,就叫做控制反转。(反之,当对象由我们自己创建,即是正转)。这样的结果就是使对象与对象之间松散耦合,更使整个程序的体系结构变得灵活。
2.2IoC和DI
DI:用于处理对象间的依赖关系
二者区别:控制反转(IOC):解决对象创建的问题,(对象的创建交给别人)。依赖注入(DI):在创建完对象后,对象关系的处理就是依赖注入,(通过set方法依赖注入。)
3.IoC具体实现
1).导入相关jar包:
当出现org.springframework.beans.factory.BeanDefinitionStoreException报错信息时,说明你的spring版本和jdk版本冲突。jdk1.7与spring3.x兼容,jdk1.8与spring3.x兼容
2).配置核心配置文件applicationContext.xml(文件名随意)
3).新建两个实体类并生成对应的set、get方法
4)创建测试类进行测试
测试成功打印出信息,说明成功获取到User对象和Dog对象。
修改代码,再次运行程序
由此可知,默认情况下,前后两次getBean()获得的是同一实例,说明spring缺省是单例。
接下来在applicationContext.xml中做如下修改,再来进行测试:
此时,从结果不难看出,u1和u2是两个不同对象,即scope=”prototype”后,每次getBean()的都是不同的新实例。
另外还有一点需要知道,当scope=”prototype”,程序运行时,IOC容器首先创建,然后当我们需要得到IOC容器中的pojo对象时我们通过语句ac.getBean("User");
得到;而当scope=”singleton”,程序运行时,该对象就已创建在IoC容器中了。
总结:在<bean>
标签中设置bean对象为单例时,该对象在系统启动时就会创建;设置为多例时,该对象在我们需要使用时才创建。
5)<bean>标签中其他一些属性:
lazy-init属性:用于指定当前Bean的初始化时间,若值为true表示在初次调用时才会自动创建实例并初始化,false表示在IoC容器创建的时候就会完成创建和初始化。
init-method属性:用于指定当前Bean的初始化方法,在Bean实例创建好后,首先会调用其指定名称的方法
destory-method属性:
同上,给该属性传递一个在pojo对象中创建的方法例如B方法的方法名B作为destoy-method的属性值,表示当IOC容器被销毁时(该pojo对象也会在IOC中销毁)会立刻调用这个B方法。当然我们通过ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
创建的IOC对象ac是没有destoy()方法的,我们需要这个创建IOC对象ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
这样创建出来的IOC对象才有destoy()方法。