Spring——基本概念(IOC,DI思想),Spring配置文件(XML),属性注入,Spring与Web项目结合
Spring简介
spring是一站式框架;正是因为spring框架性质是属于容器性质的,容器中装什么对象就有什么功能,所以可以一站式,不仅不排斥其他框架,还能帮其他框架管理对象。
- aop支持
- ioc思想
- spring jdbc
- aop 事务
- junit 测试支持
Spring的搭建
1、导包
com.springsource.org.apache.log4j-1.2.15.jar(可选)
2、创建一个对象
3、书写配置注册对象到容器
位置任意(建议放到src下)
配置文件名任意(建议applicationContext.xml)
导入约束
4、代码测试
Spring的基本概念
1、IOC思想(由自己创建改成了由程序创建)
2、DI思想
3、applicationContext&BeanFactory
BeanFactory接口
- spring原始接口.针对原始接口的实现类功能较为单一
- BeanFactory接口实现类的容器.特点是每次在获得对象时才会创建对象
ApplicationContext
- 每次容器启动时就会创建容器中配置的所有对象.并提供更多功能
- 丛类路径下加载配置文件:ClassPathXmlApplicationContext
- 从硬盘绝对路径下加载配置文件:FileSystemXmlApplicationContext("d:/xxx/yyy/xxx")
结论:web开发中,使用applicationContext. 在资源匮乏的环境可以使用BeanFactory
Spring配置
1、Bean元素下的基本属性
<!-- 将User对象交给spring容器管理 --> <!-- Bean元素:使用该元素描述需要spring容器管理的对象 class属性:被管理对象的完整类名. name属性:给被管理的对象起个名字.获得对象时根据该名称获得对象. 可以重复.可以使用特殊字符. id属性: 与name属性一模一样. 名称不可重复.不能使用特殊字符. 结论: 尽量使用name属性. scope属性: singleton(默认值):单例对象.被标识为单例的对象在spring容器中只会存在一个实例 prototype:多例原型.被标识为多例的对象,每次再获得才会创建.每次创建都是新的对象.整合struts2时,ActionBean必须配置为多例的. request:web环境下.对象与request生命周期一致. session:web环境下,对象与session生命周期一致. --> <bean name="user" class="cn.itcast.bean.User" scope="singleton" ></bean> <!-- 导入其他spring配置文件 --> <import resource="cn/itcast/b_create/applicationContext.xml"/> </beans>
2、创建对象的三种方式
a.空参构造方式
b.静态工厂(了解)
c.实例工厂(了解)
3、属性注入
复杂类型注入
1)数组
2)集合
3)字典
4)properties(键值全是String类型的字典)
Spring与Web项目结合
1、导包
spring-web-4.2.4.RELEASE.jar // 多加一个这个包
2、 封装Dao和Service对象(注意:service中提供set方法)
3、获取容器
注:这是错误的示范.导致每次请求都创建新的容器
3.1、配置容器随项目启动
<!-- 可以让spring容器随项目的启动而创建,随项目的关闭而销毁 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 指定加载spring配置文件的位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-config.xml</param-value> </context-param>
4、获取容器
//获得spring容器=>从Application域获得即可,Spring为我们封装了一个方法可以直接获取,但需要servletContext对象(获得application域) //1 获得servletContext对象 ServletContext servletcontext = ServletActionContext.getServletContext(); //2.从context中获得ac容器 WebApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(servletcontext); //3.从容器中获得CustomerService CustomerService service = (CustomerService) ac.getBean("customerService");