Spring主要是通过属性(DI)注入和控制反转(IOC),帮我们创建对象和属性注入。
第一个Spring的HelloWorld程序:
步骤:
1.准备jar包
spring-beans-4.1.2.RELEASE.jar
spring-core-4.1.2.RELEASE.jar
报错再添加:
com.springsource.org.apache.commons.logging-1.1.1.jar 不在spring中 在spring的依赖中
2.开发HelloWorld程序
3.在applicationContext.xml中完成配置( spring-framework-reference\html\xsd-config.html)直接搜索xsd-config.html
4.启动容器
5.从容器中得到bean
6.调用bean响应的方法
HelloWorld原理分析:
Spring管理bean的原理:
什么是BeanFactory:
Spring最基本的接口,表示Spring容器——生产bean对象的工厂,负责配置,创建和管理bean。
备注:bean是Spring管理的单位,在Spring中一切都是bean.
深入Spring管理bean的原理。
1、通过Resource对象加载配置文件;new classPath...
2、解析配置文件,得到指定名称的bean; new xml...
3、解析bean元素,id作为bean的名字,class用于反射得到bean的实例:
eclipse提示XML语法:
1:联网
2 : 配置DTD
①到解压spring/schemas/beans/spring-beans-4.1.xsd 。
②选择schema location 方式 。
③复制网络路径 http://www.springframework.org/schema/beans/spring-
Spring的基本配置:
在Spring配置中,id和name属性都可以定义bean元素的名称,不同的是:
id属性,遵守XML语法的ID约束(唯一)。必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号,不能以“/”开头。
name属性,就可以使用很多特殊字符,比如在Spring和Struts1或Spring MVC的整合中,就得使用name属性来的定义bean的名称。
注意:从Spring3.1开始,id属性不再是ID类型了,而是String类型,也就是说id属性也可以使用“/”开头了,而bean元素的id的唯一性由容器负责检查。(鼓掌)
当然也使用name属性为
或则
建议:bean起名尽量规范,不要搞一些非主流的名字,尽量使用id。
Spring中引入其他配置文件:
在实际开发中,随着应用规模的增加,系统中
为了避免applicationContext.xml文件过于庞大、臃肿,为提高其可读性,我们可以将一个applicationContext.xml文件分解成多个配置文件,然后在applicationContext.xml文件中包含其他配置文件即可。
使用import元素引入其他的配置文件:
使用import元素注意:
1、默认情况下,从classpath的根路径寻找。
2、可以使用前缀来定位文件的基础位置:
①:[classpath:]:后面的文件从classpath路径开始找(推荐);[注意classloader的问题。]
②:[file:]:后面的文件使用文件系统的路径开始找;
注意:只有当框架中实现了Resource接口才能够识别上述的前缀标识符。
Spring中的测试:
传统的测试存在问题:
1,每个测试都要重新启动Spring容器,启动容器的开销大,测试效率低下。
2,不应该是测试代码管理Spring容器,应该是Spring容器在管理测试代码。
Spring测试依赖jar:
Spring4.x需要依赖的单元测试得是最新的junit4.12,Eclipse自带的junit4.8不支持,同时从Spring4.x开始,还得依赖AOP包的支持。
junit-4.12.jar
hamcrest-core-1.3.jar
spring-test-4.1.2.RELEASE.jar
spring-context-4.1.2.RELEASE.jar
spring-aop-4.1.2.RELEASE.jar
spring-expression-4.1.2.RELEASE.jar
若:
把@ContextConfiguration("classpath:applicationContext.xml") 写成@ContextConfiguration
默认去找的当前测试类名-context.xml配置文件,如:HelloWorldTest-context.xml
IOC容器:
IoC容器:
BeanFactory:是Spring中最底层的接口,只提供了最简单的IoC功能,负责配置,创建和管理bean。
在应用中,一般不使用BeanFactory,而推荐使用ApplicationContext(应用上下文),原因如下。
BeanFactory和ApplicationContext的区别:
1、ApplicationContext继承了BeanFactory,拥有了基本的IoC功能;
2、除此之外,ApplicationContext还提供了以下的功能:
①、支持国际化;
②、支持消息机制;
③、支持统一的资源加载;
④、支持AOP功能;
ApplicationContext常见实现类:
1:ClassPathXmlApplicationContext:读取classpath中的资源
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
---------------------------------------------------------------------
2:FileSystemXmlApplicationContext:读取指定路径的资源
ApplicationContext ac = new FileSystemXmlApplicationContext("c:/applicationContext.xml");
---------------------------------------------------------------------
3:XmlWebApplicationContext:需要在Web的环境下才可以运行
XmlWebApplicationContext ac = new XmlWebApplicationContext(); // 这时并没有初始化容器
ac.setServletContext(servletContext); // 需要指定ServletContext对象
ac.setConfigLocation("/WEB-INF/applicationContext.xml"); // 指定配置文件路径,开头的斜线表示Web应用的根目录
ac.refresh(); // 初始化容器
bean的创建时机:
Spring中管理的bean对象到底是什么时机创建出来的?
1.ApplicationContext在加载的时候就会创建所有的bean(Web应用建议)
2.BeanFactory需要等到拿bean的时候才会创建bean (桌面程序)
此时不使用Spring Test;
延迟加载
再讲使用Spring Test注入ApplicationContext对象
控制bean的创建时机/控制是否要延迟加载(了解):
针对于当前xml中所有的bean。
针对于指定的bean:
bean的实例化方式:
bean的实例化方式:
①.构造器实例化(无参数构造器),最标准,使用最多。
②.静态工厂方法实例化:解决系统遗留问题
③.实例工厂方法实例化:解决系统遗留问题
④.实现FactoryBean接口实例化:实例工厂变种:集成其他框架使用:LocalSessionFactoryBean
bean的作用域:
bean对象的作用域(bean对象可以存活的时间):
singleton: 单例 ,在Spring IoC容器中仅存在一个Bean实例 (默认的scope)
prototype: 多例 ,每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new XxxBean():不会在容器启动时创建对象
request: 用于web开发,将Bean放入request范围 ,request.setAttribute("xxx") , 在同一个request 获得同一个Bean
session: 用于web开发,将Bean 放入Session范围,在同一个Session 获得同一个Bean
globalSession: 一般用于Porlet应用环境 , 分布式系统存在全局session概念(单点登录),如果不是porlet环境,globalSession 等同于Session
在开发中主要使用 scope="singleton"、 scope="prototype"
对于MVC中的Action使用prototype类型,其他使用singleton
Spring容器会管理Action对象的创建,此时把Action的作用域设置为prototype.
DI属性注入:
DI:Dependency Injection: 依赖注入
从字面上分析:
IoC:指将对象的创建权,反转到Spring容器;
DI :指Spring创建对象的过程中,将对象依赖属性通过配置进行注入
其实它们是同一个概念的不同角度描述。DI相对IoC而言,明确描述了“被注入对象依赖IoC容器配置依赖对象”。
自动装配方式(不推荐):
设置:
----------------------------------------------------------
autowire属性:让spring按照一定的方式自己去找合适的对象,并完成DI
- default:不要自动注入
- no:不要自动注入
- byName:按照名字注入(按照属性的名字在spring中找bean) factory.getBean("属性的名字")
- byType:按照依赖对象的类型注入(factory.getBean(属性的类型))
- constructor:按照对象的构造器上面的参数类型注入
注意:
1,如果按照byName自动注入,要求所有的属性名字和id的名字必须保证一种规范的命名方式;
2,如果按照byType注入,如果spring中同一个类型有多个实例-->报bean不是唯一类型错误;
对象注入的方式:
1):手动装配
2):自动装配(了解);
3):自动装配(注解版).
通过哪些手动可以注入:
1):可以通过属性注入(setter方法).
2):通过构造器注入.
3):通过SpEL注入.
注入的时候,可有注入哪些类型的值.
1:简单类型(一个类型只能表示一个值,如:基本类型/String,URL).
2:复合类型(复杂的对象类型)
3:集合类型
使用setter注入(属性注入):
1,使用bean元素的
1,简单类型值,直接使用value赋值;
2,引用类型,使用ref赋值;
3,集合类型,直接使用对应的集合类型元素即可。
2,spring通过属性的setter方法注入值;
3,在配置文件中配置的值都是string,spring可以自动的完成类型的转换
4,属性的设置值是在init方法执行之前完成的
5,改进spring的测试,直接在测试类里面注入需要测试的对象
property place holder(属性占位符)
使用DataSource(druid)的案例,给数据源注入Property中的数据.
准备:
MySQL驱动包和Druid连接池包.
1.引入context命名空间:
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
2.提供db.properties文件
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring
jdbc.username=root
jdbc.password=admin
jdbc.maxActive=5
3.通过
4.在applicationContext.xml中设置占位符.