Spring框架
Spring是于2003 年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以 从Spring中受益。
Spring的核心是控制反转(IOC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
EE开发分成三层结构 WEB层:Spring MVC
业务层:Bean管理:(IOC)
持久层:Spring的JDBC模板.ORM模板用于整合其他的持久层框架
Spring的框架的特点:
方便解耦,简化开发;AOP编程的支持;声明式事务的支持;方便程序的测试;方便集成各种优秀框架;降低JavaEE API的使用难度
IOC功能:
全称Inverse of Control,控制反转,将对象的创建权反转给Spring。使用IOC可以解决的程序耦合性高的问题
入门案例:
1.新建maven工程,在pom.xml文件中添加Spring框架的坐标
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
2.在resources目录下创建applicationContext.xml的配置文件,名称是可以任意的,但是一般都会使用默认名称。引入spring的约束
<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">
</beans>
3.完成接口的配置,这里举个栗子:
<bean id="userService" class="org.westos.demo1.UserServiceImpl"/>
4.编写测试程序,采用Spring框架的工厂方式来获取到UserService接口的具体实现类
方式一:使用spring的工厂
public void demo2(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 通过配置的id名从工厂获得对象:
UserService userService = (UserService) applicationContext.getBean("userService");
userService.sayHello();
}
方式二:获取bean对象:
UserService userService1 = context.getBean("userService", UserService.class);
ApplicationContext接口
使用ApplicationContext工厂的接口,使用该接口可以获取到具体的Bean对象
该接口下具体的实现类
- ClassPathXmlApplicationContext:加载src类路径下的Spring配置文件
- FileSystemXmlApplicationContext:加载本地磁盘下的Spring配置文件
- AnnotationConfigApplicationContext:读取注解创建容器的
BeanFactory工厂
BeanFactory工厂是Spring框架早期的创建Bean对象的工厂接口
BeanFactory和ApplicationContext的区别
(1)BeanFactory采取延迟加载,第一次getBean时才会初始化Bean
(2)在加载applicationContext.xml时候就会创建具体的Bean对象的实例,还提供了一些其他的功能。如事件传递,Bean自动装配等。
Spring 创建Bean对象的三种方式
方式一:
使用默认空参构造函数创建。在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时。采用的就是默认空参构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。
eg:
<bean class="org.westos.service.UserServiceImpl" id="userService"></bean>
方式二:
使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
<bean id="instanceFactory" class="org.westos.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService">
方式三:
使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
<bean id="accountService" class="org.westos.factory.StaticFactory" factory-method="getAccountService"></bean>
bean标签的配置:
1.id属性name属性
- id:给Bean起个名字,在约束中采用ID的约束,唯一
取值要求:必须以字母开始,可以使用字母、数字、连字符、下划线、句号、冒号,但不能出现特殊字符 - name:给Bean起个名字,没有采用ID的约束
取值要求:name:出现特殊字符。如果没有id的话 , name可以当做id使用
2.class属性
Bean对象的全路径
3.scope属性
scope属性代表Bean的作用范围(常用的有前两个)
- singleton:单例(默认值)
- prototype:多例,在Spring框架整合Struts2框架的时候,Action类也需要交给 Spring做管理,配置把Action类配置成多例!!
- request:应用在Web项目中,每次HTTP请求都会创建一个新的Bean 放到request 域中,- - request销毁了,对象也就没了
- session:应用在Web项目中,同一个HTTP Session 共享一个Bean Session销毁了, 里面的对象也就没了
- globalsession:应用在Web项目中,多服务器间的session
依赖注入(DI)
IOC和DI的概念
- IOC:Inverse of Control,控制反转,将对象的创建权反转给Spring
- DI:Dependency Injection,依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件中
DI(依赖注入)
eg:如果UserServiceImpl的实现类中有一个属性,那么使用Spring框架的IOC功能时,可以通过依赖注入把该属性的值传入进来
具体的配置如下:
public class UserServiceImpl implements UserService {
private String name; //提供属性
public void setName(String name) { //提供set方法
this.name = name;
}
}
<bean id="us" class="org.westos.demo1.UserServiceImpl">
<property name="uname" value="小风"/>
</bean>