前言
好了,为了巩固spring,那我也去写一个spring4.0的笔记...这个也是以前学习spring框架没有去写的笔记
Hello World
- Spring 是一个开源框架.
- Spring 为简化企业级应用开发而生.
- Spring 是一个 IOC(DI) 和 AOP 容器框架.
Spring 模块
搭建 Spring的 HelloWorld
HelloWorld.java
package com.glj.bean; public class HelloWorld { private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public void toHello(){ System.out.println(userName); } }
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="hello" class="com.glj.bean.HelloWorld"> <property name="userName" value="hello Spring"></property> </bean> </beans>
HelloWorldTest.java
package com.glj.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.glj.bean.HelloWorld; public class HelloWorldTest { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); HelloWorld hw = (HelloWorld) ac.getBean("hello"); hw.toHello(); } }
IOC 前生 --分离接口与实现
IOC 前生 --采用工厂设计模式
IOC --采用反转控制
在 Spring 的 IOC 容器里配置 Bean
<bean id="hello" class="com.glj.bean.HelloWorld"> <property name="userName" value="hello Spring"></property> </bean>
- id:Bean 的名称
- -在 IOC 容器中必须是唯一的
- -若 id 没有指定,Spring 自动将权限定性类名作为 Bean 的名字
- -id 可以指定多个名字,名字之间可用逗号、分号、或空格分隔
Spring 提供了两种类型的 IOC 容器实现.
- BeanFactory: IOC 容器的基本实现.
- ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口.
- BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身.
- ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory
- 无论使用何种方式, 配置文件时相同的.
ApplicationContext
ApplicationContext 的主要实现类:
- ClassPathXmlApplicationContext:从 类路径下加载配置文件(在src下面而不是包或者其他下面)
- FileSystemXmlApplicationContext: 从文件系统中加载配置文件(很少用这种)
ConfigurableApplicationContext 扩展于 ApplicationContext,新增加两个主要方法:refresh() 和 close(), 让 ApplicationContext 具有启动、刷新和关闭上下文的能力.
ApplicationContext 在初始化上下文时就实例化所有单例的 Bean。
WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作.
结构如下图:
从 IOC 容器中获取 Bean
- 调用 ApplicationContext 的 getBean() 方法
即可有两种:
1.HelloWord hw= ac.getBean(HelloWord.class);这种方法基于类型来获取,如果类中有多个相同的bean的名称,这种方法将不在合适
2.HelloWord hw= (HelloWord) ac.getBean("helloWord");这种方法基于Bean的Id来获取,使用范围比上面较广
依赖注入的方式
Spring 支持 3 种依赖注入的方式:
- 属性注入
- 构造器注入
- 工厂方法注入(很少使用,不推荐)
属性注入(最常用的注入方式):
- 属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象
- 属性注入使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值
<bean id="hello" class="com.glj.bean.HelloWorld"> <property name="userName" value="hello Spring"></property> </bean>
构造方法注入:
- 通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用
- 构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中没有 name 属性
<!-- 按索引匹配入参: --> <bean id="hello" class="com.glj.bean.HelloWorld"> <constructor-arg value="hello" index="0"></constructor-arg> </bean> <!-- 按类型匹配入参:--> <bean id="hello1" class="com.glj.bean.HelloWorld"> <constructor-arg value="hello1" type="java.lang.String"></constructor-arg> </bean>
字面值:
- 字面值:可用字符串表示的值,可以通过 <value> 元素标签或 value 属性进行注入
- 基本数据类型及其封装类、String 等类型都可以采取字面值注入的方式
- 若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来
引用其它 Bean:
可以通过 <ref> 元素或 ref 属性为 Bean 的属性或构造器参数指定对 Bean 的引用.
也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean
<bean id="dog" class="com.glj.bean.Dog"> <property name="name" value="glj只狗" /> <property name="sex" value="男" /> <!-- <property name="foot" ref="foot" /> 或者 --> <property name="foot"> <ref bean="foot"/> </property> </bean> <bean id="foot" class="com.glj.bean.Foot"> <property name="name" value="骨头" /> </bean>
内部 Bean
- 当 Bean 实例仅仅给一个特定的属性使用时, 可以将其声明为内部 Bean.
- 内部 Bean 声明直接包含在 <property> 或 <constructor-arg> 元素里, 不需要设置任何 id 或 name 属性
- 内部 Bean 不能使用在任何其他地方
<bean id="dog" class="com.glj.bean.Dog"> <property name="name" value="glj只狗" /> <property name="sex" value="男" /> <property name="foot"> <bean class="com.glj.bean.Foot"> <property name="name" value="骨头"></property> </bean> </property> </bean>
今天就先记到这里吧...
晚安...