Spring介绍:
- Spring它是一个一站式的分层轻量级框架。
Spring的作用: - Spring致力于提供一种方法管理你的业务对象。
- Spring的主要目的是使JavaEE易用和促进好编程习惯
- Spring致力于J2EE应用的各层的解决方案,而不是仅仅与专注某一层的方案。可以说Spring是企业应用开发的“一站式”选择,并贯穿表现层、业务层及持久层。然而,Spring并不想取代那些已有的框架,而是与它们无缝地整合。
Spring体系结构:
1.Core Container(核心容器) - Beans与Core它们提供Spring框架最基本功能,包含IOC于DI
- context上下文对象,基于beans与core
- spel它是Spring提供的一个表达式语言
2.Data Access/integration - 数据访问
- 集成
3.Web - Spring本身提供Spring MVC
- 也可以像其他web层进行集成
4.AOP - AOP大部分情况下是使用动态代理来实现的
5.Test - 使用spring可以方便地进行测试
Spring开发环境搭建
在Spring开发中,我们要根据不同的情况来导入不同的jar包。
ioc和di
1.beans相关
2.core相关
3.context相关
4.spel相关
在Spring框架会使用到配置文件,我们需要在src下创建一个关于Spring的配置文件,一般情况下叫applicationContext.xml
applicationContext.xml约束。
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
ICO与DI
ICO控制反转
就是原来由我们自己实例化的对象交给Spring容器来实始化。这时对象的实始化的权利就会反转
Spring使用步骤:
1.在applicationContext.xml文件中配置bean
<bean name="userService" class="com.baidu.UserServiceImpl"></bean>
2.创建一个AppliCationContext对象
AppliCationContext它是BeanFactory的一个子接口,我们在使用时使用的是AppliCationContext的实现类ClassPathXmlApplicationContext
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
IUserService userService = (IUserService) applicationContext.getBean("userService");
userService.sayHello();
可以通过getBean(配置文件中id名称)来获取指定的对象。
DI
DI:dependency Injection依赖注入
在Spring框架负责创建Bean对象时,动态将依赖对象注入到Bean组件。
private String info;
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
<bean name="userService" class="com.baidu.UserServiceImpl">
<property name="info" value="Spring"></property>
</bean>
Bean获取与实例化
1.Bean的获取方式
ApplicationContext它是扩展BeanFactory接口。
BeanFactory它采取延迟加载的方案,只有真正在getBean时才会实例化Bean。
在开发中我们一般使用的是ApplicationContext真正使用的是其实现类。
FileSystemXmlAppliCationContext根据文件路径获取
ClassPathXmlApplicationContext根据类路径获取
AppliCationContext它会在配置文件加载时,就会初始化Bean,并且AppliCationContext它是提供不同的应用层的Context实现。例如在web开发中可以使用WebApplicationContext.
BeanFactory factory=new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext applicationContext=new FileSystemXmlApplicationContext("src/applicationContext.xml");
2.Bean的实例化方式
- 无参数构造
对于这种方式,注意Bean类中必须提供无参数构造。
<bean id="bean1" class="com.baidu.bean.Bean1">
- 静态工厂方法
需要创建一个工厂类,在工厂类中提供一个static返回bean对象的方法就可以
public class Bean2Factory {
public static Bean2 createBean2(){
return new Bean2();
}
}
<!-- 静态工厂方法 -->
<bean name="bean2" class="com.baidu.bean.Bean2" factory-method="createBean2">
- 实例工厂方法
需要创建一个工厂类,在工厂类中提供一个非static的创建bean对象的方法,在配置文件中需要将工厂配置,还需要配置bean;
public class Bean3Factory {
public Bean3 createBean3(){
return new Bean3();
}
}
<bean name="bean3Factory" class="com.baidu.bean.Bean3Factory"></bean>
<bean name="bean3" factory-bean="bean3Factory" factory-method="createBean3"></bean>
3.Bean的作用域
在Bean声明时它有一个scope属性,它是用于描述bean的作用域
可以取值有:
- singleton:单例,代表在spring ioc容器中只有一个Bean实例(默认的scope)
- prototype:多例,每一次从Spring容器中获取时,都会返回一个新的实例
- request:用在web开发中,将Bean对象request.setAttribute()存储到request域中
- session:用在web开发中,将bean对象session.setAttrubute()存储到session域中
4.Bean的属性注入
构造器注入:
<bean id="car" class="com.baidu.di.Car">
<constructor-arg index="0" type="java.lang.String" value="宝马"></constructor-arg>
<constructor-arg index="1" type="double" value="1000000"></constructor-arg>
</bean>
Setter注入:
<bean id="car1" class="com.baidu.di.Car">
<property name="name" value="奔驰"></property>
<property name="price" value="200000"></property>
</bean>
关于ref属性作用
<bean id="person" class="com.baidu.di.Person">
<property name="name" value="张三"></property>
<property name="car" ref="car1"></property>
</bean>
使用ref来引入另一个bean对象,完成bean之间注入
集合属性的注入
<bean id="collectionDemo" class="com.baidu.di.CollectionDemo">
<property name="list">
<list>
<value>李四</value>
<value>10</value>
<ref bean="car"/>
</list>
</property>
</bean>
名称空间p和c的使用
Spring2.0以后提供了xml命名空间。
<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">
P名称空间
C名称空间
首先它们不是真正的名称空间,是虚拟的。它是嵌入到spring内核中的。
使用p名称空间可以解决我们setter注入时简化
使用c名称空间可以解决我们构造器注入时简化
使用setter注入
<bean id="dog1" class="cn.baidu.namsapce.Dog"> <property name="name"
value="吉娃娃" /> <property name="color" value="黄色"></property> </bean>
在applicationContext.xml文件中添加p名称空间简化setter注入
xmlns:p="http://www.springframework.org/schema/p"
<bean id="dog1" class="cn.baidu.namsapce.Dog" p:name="博美"
p:color="白色"></bean>
使用c名称空间来解决构造器注入
<bean id="dog2" class="cn.baidu.namsapce.Dog">
<constructor-arg index="0" value="黑色" />
<constructor-arg index="1" value="大丹" />
</bean>
在applicationContext.xml文件中添加c名称空间
xmlns:c="http://www.springframework.org/schema/c"
<bean id="dog2" class="cn.baidu.namsapce.Dog" c:name="大丹"
c:color="黑色"></bean>
SpEl
它类似于ognl或el表达式,它可以提供在程序运行是构造复杂表达式来完成对象属性存储及方法调用等。
Spel表达式的格式 #{表达式}
示例1:完成bean之间的注入
<bean id="person1" class="com.baidu.namsapce.Person">
<property name="name" value="张三" />
<!-- <property name="dog" ref="dog1"/> -->
<property name="dog" value="#{dog1}"></property>
</bean>
示例2 支持属性调用及方法调用
<bean id="person1" class="com.baidu.namsapce.Person">
<property name="name" value="#{person.name}" />
<!-- <property name="dog" ref="dog1"/> -->
<property name="dog" value="#{dog1}"></property>
<property name="age" value="#{person.getAge()+10}"></property>
</bean>
Spring注解开发
在 Spring中使用注解,我们必须在applicationContext.xml文件中添加一个标签
< context:annotation-config/>作用是让Spring中常用的一些注解生效
完成Bean注册操作
@Component
相当于< bean name=“userService” class=“com.baidu.UserServiceImpl”>
我们在applicationContext.xml文件中使用了一个标签 < context:annotation-config />,它代表的是可以使用spring的注解,但是我们在类上添加的注解,spring不知道位置。
要解决这个问题,我们可以使用< context:component-sacn base-package=””>
<context:component-scan base-package="com.baidu.annotation"/>
衍生注解
@Rpository用于DAO层
@Service用于Service
@Controller用于用于表现层
属性依赖注入
- 简单的属性注入
@Value - 复杂的属性注入
@Autowird
如果与@Qualifier一起使用,就可以根据名称来进行注入
可以根据名称一起来进行注入
@Resource(name=“userDao”)
扫描多个包可以使用
<context:component-scan base-package="com.baidu"/>
其他注解:
@Scope它可以描述bean的作用域
@Scope(“prototype”)
@PostConstruct相当于init-method="mylnit"初始化
@PostDestroy相当于是destroy-method=“myDestroy”
注意:对于销毁的方法它只对bean的scope="singleton"有效
Spring整合junit4
Spring整合junit4可以方便我们的测试
1.需要导入spring-test.jar包
2,进行操作
@RunWith(SpringJUnt4ClassRunner.class)Spring整合junit4
@ContextConfiguration(locations=“classpath:applicationContext.xml”)spring配置文件位置