Spring的概述:
什么是spring?
一个开源框架,轻量级,核心是控制反转(IoC)和面向切面(AOP),是一个一站式框架。spring就是一个大工厂,用于生成bean;
层:(随便写的)
struts:web层,比较简单;
hibernate:相当于dao,知识很杂;
spring:service层,很重要。

spring分层架构:

Springmvc 导入依赖_xml

①入门案例:IoC

1.1 导入jar包:

4+1:4个核心(beans,core,context,expression),一个依赖(commons-loggins…jar);如下依赖和核心,这里解释下spring的依赖在3.0.2以后是没有的

Springmvc 导入依赖_spring_02


包里的jar包说明:

Springmvc 导入依赖_作用域_03


Springmvc 导入依赖_Springmvc 导入依赖_04

最终截图:

Springmvc 导入依赖_作用域_05


1.2 目标类

提供userService接口和实现类;提供userService实现类的实例。

之前的开发,直接new一个就行,学习spring之后,将由spring创建实例对象-----》IoC = inverse of control

之后需要实例化对象时,从spring工厂(容器)中获得,需要将实现类的全限定名称配置到xml文件中。接口和实现类的关系导入

Springmvc 导入依赖_spring_06

接口

package com.spring.studyIoC;

public interface UserService {

	public void addUser();

}

实现类

package com.spring.studyIoC;

public class UserServiceImpl implements UserService {

@Override
public void addUser() {
	// TODO 自動生成されたメソッド・スタブ
	System.out.println("添加user");
	}
}

接下来是配置文件
位置:任意,但是一般在开发中一般在classpath下(src)
名称:任意,但是一般在开发中常用applicationContext.xml
内容:添加schema约束

找到约束文件的位置D:\spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html里面最后一个文件xsd-config.html
用浏览器方式打开,可以看到你所需要的xml内容,copy过去。

Springmvc 导入依赖_作用域_07

测试比较(利用junit)

Springmvc 导入依赖_spring_08

@Test
public void test2(){
	//从spring容器中获得,
	//1.获得容器,
	String  xmlPath = "com/spring/studyIoC/applicatiionContext.xml";
	ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
	//2.获得内容,通过id
	UserService userService = (UserService)applicationContext.getBean("UserService");
	userService.addUser();
}

2.入门案例:DI(依赖注入,dependency injected)
依赖:
前提知识,is a:是一个,继承;has a:有一个,成员变量,称为依赖

class B{
   private A a;//B类依赖A类
}

依赖:一个对象需要另一个对象
注入:通过sette方法进行另一个对象实例设置。
例如:

class BookServiceImpl{
		//之前的开发,接口 = 实现类(service和dao耦合)
		//private BookDao bookDao = new BookDaoImpl();
		//spring之后(解耦)
		private BookDao bookDao;
		setter方法
	}

模拟spring执行过程
创建service实例:BookService bookService = new BookServiceImpl();//------>IoC (<bean
创建dao实例:BookDao bookDao = new BookDaoImpl();//----->IoC
将dao设置给service:bookService.setBookDao (bookDao );//------>DI (<property

创建目标类:

创建BookService接口和实现类

创建BookDao接口和实现类

将dao和service配置到xml中

基本同上面的例子,不一一列举。

Springmvc 导入依赖_xml_09


配置文件(这里截图上,有.java,是错误的,另外不能是"/",只能是".")

Springmvc 导入依赖_Springmvc 导入依赖_10

接口抽出的方法

Springmvc 导入依赖_spring_11

测试结果(这里是“/”)

Springmvc 导入依赖_Springmvc 导入依赖_12


XML快捷方法:alt+"/"。如果没有提示的话, 通过设定 >>>xml catalog>>选择xsd文件,添加

3.核心API
①BeanFactory:这是一个工厂,用于生成各种bean.
②ApplicationContext:是BeanFactory的子接口,功能更加强大。(国际化处理,事件传递,Bean自动装配,各种不同的应用层的的context实现)
ClassPathXmlApplicationContext:用于加载classPath(类路径,src)下的xml。–加载xml位置–>/WEB-INF/classs/…xml
FileSystemXmlApplicationContext 用于加载指定盘符下的xml。–加载xml位置–>/WEB-INF/…xml
两者的差距,一,一加载配置文件就被new了;二,实现方式BeanFactory beanFactory = new BeanFactory (new ClassPathResource(xmlPath));当去getBean的时候,才被new。
盘符的取得:servletCcontext.getRealPath()

4.装备bean基于xml

4.1 bean的三种实例化方式

①默认构造:默认的方式,定义好bean后,不用自己编写。

②静态工厂:常用于spring去整合其他的框架(工具),是用于生成实例对象的,所有的方法必须是static

Springmvc 导入依赖_xml_13


还是利用上面的UserServce系列

首先工厂:

package com.spring.studyStaticFactory;

public class MyBeanFactory {

/**
 * 创建实例
 * @return
 */
public static UserService createService(){
	return new UserServiceImpl();
}

}
配置文件:

<!--  将静态创建的bean交予spring  factory-method是静态方法-->
<bean id="UserService" class="com.spring.studyStaticFactory.MyBeanFactory" factory-method="createService"></bean>

测试实例

/**
 * 利用junit进行测试,junit实行
 */
@Test
public void test2(){
	//自定义工厂
	UserService userService = MyBeanFactory.createService();
	userService.addUser();
}

@Test
public void test1(){
	//spring工厂
	String xmlPath = "com/spring/studyStaticFactory/applicationContext.xml";
	ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
	//同时解决每次需要强转问题
	UserService userService = applicationContext.getBean("UserService",UserService.class);
	userService.addUser();
}

}

③实例工厂
实例工厂:必须先有工厂 实例对象,通过实例对象创建对象,提供的所有的方法,都是“非静态”的
上面的方法改为静态:
测试实力:

@Test
public void test2(){
	//自定义实例工厂
	MyBeanFactory myBeanFactory = new MyBeanFactory();
	UserService userService = myBeanFactory.createService();
	userService.addUser();
}

@Test
public void test1(){
	//spring工厂
	String xmlPath = "com/spring/studyStaticFactory/applicationContext.xml";
	ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
	//同时解决每次需要强转问题
	UserService userService = applicationContext.getBean("UserService",UserService.class);
	userService.addUser();
}

配置文件:
		
<!--  创建工厂实例-->
<bean id="myBeanFactory" class="com.spring.studyStaticFactory.MyBeanFactory"></bean>
<!-- 获得userService -->
<bean id="userService" factory-bean="myBeanFactory" factory-method="createService"></bean>

bean种类:认为的进行划分:
①普通bean。<bean id="" class="" ,spring直接创建A实例,并返回。
②FactoryBean:是一个特殊的bean,具有工厂生产对象的能力,之生成特定的对象,生成特殊的bean,比如ProxyFactoryBean(代理实例对象,AOP时使用),必须去实现FactoryBean接口。这个接口提供了一个方法getObject()用于获得特定的bean。
<bean id="" class=“FB” ,现在创建FB实例,使用调用getObject()方法,并返回方法的返回值。
FB fb= new FB();
return fb.getObject();
③BeanFactory:工厂,用于生成任意bean。

bean的作用域

作用域:用于确定spring创建bean实例个数。
在Spring 容器当中,一共提供了5种作用域类型,在配置文件中,通过属性scope来设置bean的作用域范围。
①singleton(单例,默认值):

<bean id="UserService" class="com.spring.studyStaticFactory.UserServiceImpl" scope="singleton"></bean>

当Bean的作用域为singleton的时候,Spring容器中只会存在一个共享的Bean实例,所有对Bean的请求只要id与bean的定义相匹配,则只会返回bean的同一实例。单一实例会被存储在单例缓存中,为Spring的缺省作用域。
②prototype(多例,每执行一次getBean将获得一个实例):

<bean id="UserService" class="com.spring.studyStaticFactory.UserServiceImpl" scope=" prototype "></bean>

每次对该Bean请求的时候,Spring IoC都会创建一个新的作用域。
对于有状态的Bean应该使用prototype,对于无状态的Bean则使用singleton
③request:

<bean id="UserService" class="com.spring.studyStaticFactory.UserServiceImpl" scope=" request "></bean>

Request作用域针对的是每次的Http请求,Spring容器会根据相关的Bean的
定义来创建一个全新的Bean实例。而且该Bean只在当前request内是有效的。
④session:

<bean id="UserService" class="com.spring.studyStaticFactory.UserServiceImpl" scope=" session "></bean>

针对http session起作用,Spring容器会根据该Bean的定义来创建一个全新的Bean的实例。而且该Bean只在当前http session内是有效的。
⑤global session:
<bean id=“UserService” class=“com.spring.studyStaticFactory.UserServiceImpl"scope=“globalSession”>

spring中bean的生命周期(很重要)

Springmvc 导入依赖_xml_14


4.2 bean装配基于xml-属性注入–setter方法

4.3 bean装配基于xml-属性注入–p命名空间
是对setter的简化
只需要在配置文件加一个:xmlns:p=“http://www.springframework.org/schema/p”,即可
4.4 bean装配基于xml-属性注入–SpEl
对property进行统一格式,所有内容都用value:<property name="" value="#{表达式}"
#{123},#{‘jack’},#{beanId},#{beanId.propertyName},#{beanId.methodName()},#{user.namematchstick ‘[a-z]{6,}’}
4.5 bean装配基于xml-属性注入–集合注入(重要)
集合的注入都是个property添加子标签:

< !--常见集合,普通数据--<value>,引用数据--<ref>
数组--<array>
list---<list>
set----<set>
map---<map>
Properties---<props>
arrayData等是前面定义好的-->
<bean id=”collletionData“ class="">
		<property name="arrayData">
				<array>
					<value>ds</value>
					<value>dsd</value>
					<value>dss</value>
				</array>
		</property>
		<property name="listData">
				<list>
					<value>ds</value>
					<value>dsd</value>
					<value>dss</value>
				</list>
		</property>
		<property name="setData">
				<set>
					<value>ds</value>
					<value>dsd</value>
					<value>dss</value>
				</set>
		</property>
		<property name="mapData">
				<map>
					<entry key="jack" vlaue="jack"></entry>
					<entry key="luoli" vlaue="wangzi"></entry>
				</map>
		</property>	
		<property name="propsData">
				<props>
					<props key="jack"> jack</props>
					<entry key="luoli">wangzi</props>
				</props>
		</property>							
</bean>

5.bean装配基于注解*

什么叫注解?即使一个类,使用@注解名称,在开发中,我们使用注解取代XML配置文件。优点,开发速度快;注解就是魔糖

1,@Component(“id”) 取代 < bean id=“” class=“”

注解使用前提:

①把黑色的部分加入配置文件中

schema命名空间,让spring注解,默认xmlns="":我们常见的bean标签。显示的标签:xmlns:别名=“”,例如:<context:

②确定schema.xsd文件的位置,固定名字:xsi:schemaLoaction=“名称 位置 名称2 位置2”

Springmvc 导入依赖_作用域_15


配置组件扫描

<context:component-scan base-package="包名"></context:component-scan>

2,web开发中,提供了3个@Component注解衍生注解。(功能一样)
@Repository:dao层
@Service:service层
@Controller:web控制层

3,依赖注入:
普通值:@Value("")
引用值:
方式1:按照类型注入 @Autowired;
方式2:按照名称注入(配合使用)
@Autowired
@Qualifier(“名称”)
方式3:按照名称注入@Resource(“名称”)

例子:(穿插mvc的思想)来说明使用注解代替xml的好处。这样就不用费心去写xml,开发速度快很多。但是xml也有优点,那就是一目明了。

Springmvc 导入依赖_spring_16

4,生命周期
初始化:@PostConstruct
销毁:PreDestory
这两个注解用在初始化方法和销毁方法

5,作用域
@Scope(“prototype”) 由单例变成多例(默认单例)