Spring的概述:
什么是spring?
一个开源框架,轻量级,核心是控制反转(IoC)和面向切面(AOP),是一个一站式框架。spring就是一个大工厂,用于生成bean;
层:(随便写的)
struts:web层,比较简单;
hibernate:相当于dao,知识很杂;
spring:service层,很重要。
spring分层架构:
①入门案例:IoC
1.1 导入jar包:
4+1:4个核心(beans,core,context,expression),一个依赖(commons-loggins…jar);如下依赖和核心,这里解释下spring的依赖在3.0.2以后是没有的
包里的jar包说明:
最终截图:
1.2 目标类
提供userService接口和实现类;提供userService实现类的实例。
之前的开发,直接new一个就行,学习spring之后,将由spring创建实例对象-----》IoC = inverse of control
之后需要实例化对象时,从spring工厂(容器)中获得,需要将实现类的全限定名称配置到xml文件中。接口和实现类的关系导入
接口
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过去。
测试比较(利用junit)
@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中
基本同上面的例子,不一一列举。
配置文件(这里截图上,有.java,是错误的,另外不能是"/",只能是".")
接口抽出的方法
测试结果(这里是“/”)
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
还是利用上面的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的生命周期(很重要)
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”
配置组件扫描
<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也有优点,那就是一目明了。
4,生命周期
初始化:@PostConstruct
销毁:PreDestory
这两个注解用在初始化方法和销毁方法
5,作用域
@Scope(“prototype”) 由单例变成多例(默认单例)