- 主要内容
- 基本概念
- Spring 的 IOC 操作
- Bean 实例化的方式
- Bean 标签的常用属性
- 属性注入
- 注入复杂属性
- IOC 和 DI
基本概念
- Spring是一个开源的,轻量级的框架。
(1)开源的:开源软件是将软件以源代码形式发布,并遵循GPL等开源协议,用户不仅能使用,而且可以对软件进行改进。
(2)免费的:免费软件通常以二进制文件形式发布。用户虽然可以免费使用,但无权对软件进行任何修改。
(3)轻量级:框架使用不需要依赖其他的东西。 - Spring的核心主要两部分
(1)aop:面向切面编程。扩展功能不是修改源代码实现。
(2)ioc:控制反转。把对象的创建不是通过 new 的方式来实现,而是交给 Spring 配置创建类对象。 - Spring是一站式框架。
(1) spring 在 javaEE 三层结构中,每一层都提供了不同的解决技术
(2) web层:SpringMVC
(3) service:Spring 的 IOC
(4) dao层:Spring 的 jdbcTemplate
Spring的IOC操作
- 把对象的创建交给 Spring 进行管理
- ioc 操作两部分
(1)ioc 的配置文件方式
(2)ioc 的注解方式 - IOC 底层原理使用的技术
(1)xml 配置文件
(2)dom4j 解析 xml
(3)工厂设计模式
(4)反射
Bean实例化的方式
- 在 Spring 里面通过配置文件创建对象
bean 实例化的三种方式实现(在spring.xml中配置bean标签)
(1)第一种:使用类的无参数构造创建<bean id="user" class="com.study.User"></bean>
注意:
- id 表示名称,可以为任意名称,但不能包含特殊符号(不能加下划线)根据 id 得到配置对象
- class 表示创建对象所在类的全路径
- 使用这种配置方法,需要注意:配置文件中的类里面必须包含无参构造方法。否则会报错:Error creating bean with name 'user' defined in class path resource [spring.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.study.User]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.study.User.<init>()
(2)第二种:使用静态工厂创建
<bean id="user02" class="com.study.UserFactory" factory-method="getUser"></bean>
其中 factory-method 用来表示:静态工厂类中获取对象的方法
静态工厂的类 :public class UserFactory { public static User getUser(){ return new User(); } }
(3)第三种:使用实例工厂创建
<bean id="user03Factory" class="com.study.UserFactory2"></bean> <bean id="user03" factory-bean="user03Factory" factory-method="getUser"></bean>
其中 factory-bean 用来表示:静态工厂类在配置文件中的 id 值
实例工厂类:public class UserFactory2 { public User getUser(){ return new User(); } }
Bean 标签的常用属性
- id 名称:可以为任意名称,不能包含特殊符号(不能加下划线) 根据 id 得到配置对象
- class: 创建对象所在类的全路径
- name: 功能和 id 属性是一样的。但是属性值里面可以包含特殊符号(_ # 等) 针对整合 strut1 中的 action 名称。
- scope:
- singleton(默认值):单例
- prototype:多例
- request:创建对象,把对象放到request 域里面
- session:创建对象,把对象放到 session 域里面
- globalSession:创建对象,把对象放到 globalSession 域里面
属性注入
使用 set 方法注入(在 bean 标签里面加入 property 子标签)。
<bean id="user" class="com.study.User" scope="prototype"> <!-- 注入属性值 --> <property name="username" value="李四"></property> </bean>
name :类里面定义的属性值。
value :设置具体的值。
注意:对应(User)类中要有对应属性的 set 方法。使用有参构造注入(在 bean 标签里面加入 constructor-arg 子标签)。
<bean id="user" class="com.study.User" > <constructor-arg name="username" value="张三"></constructor-arg> </bean>
name :类里面定义的属性值。
value :设置具体的值。注入对象类型属性
<bean id="user" class="com.study.User" scope="prototype"</bean> <!-- 注入对象类型属性 --> <bean id="admin" class="com.study.Admin"> <property name="user" ref="user"></property> </bean>
name 属性值:service 类里面属性名称。(现在不用 value 属性,因为刚才是字符串,现在是对象)。
ref 属性:dao 配置 bean标签中 id 值。p 名称方式注入
引入约束(p必须是小写):xmlns:p="http://www.springframework.org/schema/p"
在 bean 中配置(p 必须小写)
<bean id="user" class="com.study.User" p:username="p名称注入"></bean> <bean id="adminP" class="com.study.Admin" p:user-ref="user"></bean>
注意:字母必须为小写p 否则报错(错误为把 p 改为 z)
Configuration problem:
Unable to locate Spring NamespaceHandler for XML schema
namespace [http://www.springframework.org/schema/z]
注入 复杂属性
首先要在对应类中定义对应的属性,并且生成对应的 set 方法。
private String[] arr; private List<String> list; private Map<String,String> map; private Properties prop; public void setUser(User user) { this.user = user; } public void setArr(String[] arr) { this.arr = arr; } public void setList(List<String> list) { this.list = list; } public void setMap(Map<String, String> map) { this.map = map; } public void setProp(Properties prop) { this.prop = prop; }
在 Spring.xml 中进行相应的配置
<!-- 注入 复杂属性 --> <bean id="adminList" class="com.study.Admin"> <!-- 注入数组属性 --> <property name="arr"> <list> <value>"1"</value> <value>"2"</value> <value>"3"</value> </list> </property> <!-- 注入 list 属性 --> <property name="list"> <list> <value>"a"</value> <value>"b"</value> <value>"c"</value> </list> </property> <!-- 注入 map 属性 --> <property name="map"> <map> <entry key="a" value="1"></entry> <entry key="b" value="2"></entry> <entry key="c" value="3"></entry> </map> </property> <!-- 注入 Properties 属性 --> <property name="prop"> <props> <prop key="key">value</prop> <prop key="key1">value1</prop> </props> </property> </bean>
IOC 和 DI
IOC:控制反转,把对象创建交给 spring 进行配置
DI:依赖注入,向类里面的属性中设置值
关系:
依赖注入不能单独存在,需要在 IOC 基础之上完成操作。