1 Spring介绍
1.1 Spring概述
Spring是一个开源框架,与2003年兴起的轻量级Java开发框架。它是为了解决企业应用开发的复杂性而创建的。Spring是一个轻量级的控制反转和面向切面的容器框架。
方便解耦,简化开发:
- Spring就是专门生产Bean的大工厂,可以将所有对象创建和依赖关系维护由Spring管理。
 
面向切面(AOP)编程的支持:
Spring提供面向切面编程,可以方便实现对程序进行权限拦截、运行监控等功能。
声明式事务的支持:只需要通过配置就可以完成对事物的管理,为无需手动编程。
方便程序的测试:
- Spring支持Junit4,可以通过注解方便测试Spring程序。
 
方便集成各种优秀框架:
- 其内部提供了对各种优秀框架的支持。
 
降低JavaEE API的使用难度:
- 对JavaEE开发中一些难用的API(JDBC、JavaMail、远程调用等),都提供了封装,这些API的应用难度大大降低。
 
1.2 Spring体系结构
Spring是一个分层结构,它包含一系列的功能要素并被分为大约20个模块。这些模块如下图所示:

2 Spring快速入门
web中集成Spring需要哪些包?IOC是什么?
2.1 编写流程
- 下载Spring开发包。
 - 导入Spring的jar包。
 - 配置Spring的核心xml文件
 - 在程序中读取Spring的配置文件来获取bean(new好的对象)。
 
Spring各个版本的下载地址:
https://repo.spring.io/libs-release-local/org/springframework/spring/
第三方依赖包下载地址:
2.2 详细过程
写个简单的service。
UserServiceImpl.java
1  | public class UserServiceImpl implements UserService{  | 
接下来使用Spring IoC控制反转创建实例,在src目录下写beans.xml配置文件。
1  | 
  | 
test1.java
1  | public class test1 {  | 
结果:
1  | 创建用户...name01  | 
会发现其实 us1 和 us2 是同一个对象。
2.3 IoC 控制反转
Inverse of Control 控制反转的概念,就是将原本在程序中手动创建对象的控制权,交给Spring框架管理。创建对象的控制权被反转到达了Spring框架。
2.4 DI 依赖注入
Dependency Injection 依赖注入,在Spring框架负责创建Bean对象时,动态地将依赖对象注入到Bean组件。
3 创建Spring容器的三种方式
3.1 三种方式
第一种:ClassPathXmlApplicationContext,参数中传入的是xml文件的对于src的相对路径。
1  | ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");  | 
第二种:文件系统路径获得配置文件,绝对路径。
1  | ApplicationContext context = new FilePathXmlApplicationContext("C:\Users\38487\Desktop\IDEAWorkSpace\SpringDemo\src\beans.xml");  | 
第三种:使用BeanFactory(已过时)。
1  | String path = "C:\Users\38487\Desktop\IDEAWorkSpace\SpringDemo\src\beans.xml";  | 
在Spring内部:
- 解析xml文件,获取类名,id,属性。
 - 通过反射,用类型创建对象。
 - 给创建的对象赋值。
 
3.2 BeanFactory和ApplicationContext的对比
- BeanFactory采取延迟加载,第一次getBean时才会初始化Bean。
 - ApplicationContext是对BeanFactory的扩展,提供了更多功能:
- 国际化处理。
 - 事件传递。
 - Bean自动匹配。
 - 各种不同应用程的Context实现。
 
 
4 装配Bean
4.1 装配Bean的三种方式
所谓的装配Bean,就是在xml中写<bean>标签。
第一种:new实现类。
1  | <bean id="userService" class="com.Retur0.service.UserServiceImpl"></bean>  | 
第二种:通过静态工厂方法。
写一个静态工厂类,返回需要的对象。在Bean中配置这个工厂类,使用时getBean(“id”),返回为需要的对象。
1  | <bean id="userService" class="com.Retur0.service.UserSereviceFactory" factory-method="createUserService"></bean>  | 
第三种:通过实例工厂方法。
写一个工厂类,返回需要的对象。
1  | <bean id="factory" class="com.Retur0.service.UserSereviceFactory"></bean>  | 
4.2 Bean的作用域
- singleton:单例,在Spring容器中只存在一个Bean实例,默认值。
 - prototype:每次从容器中调用bean时吗,都返回一个新的实例。每次调用fgetBean()时,相当于执行new XXXBean()。
 - request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境。
 - session:同一个HTTP Session共享一个Bean,不同session使用不同bean。仅适用于WebApplicationContext环境。
 - globalSession:一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext环境。
 
1  | <bean id="userService" class="com.Retur0.service.UserServiceImpl" scope="prototype"></bean>  | 
5 xml依赖注入Bean属性
5.1 构造方法注入
在bean中,加入给属性初始化的构造函数。这样在xml中可以如下操作:
1  | <bean id="stu" class="com.Retur0.model.Student">  | 
还可以这么写:
1  | <bean id="stu" class="com.Retur0.model.Student">  | 
5.2 属性setter方法注入
通过<property>标签注入。
5.3 p命名空间注入
在xml文件的约束中加入一行:
1  | xmlns:p="http://www.springframework.org/schema/p"  | 
这样就引入了p命名空间,这个命名空间中有类的属性。
1  | <bean id="stu" class="com.Retur0.model.Student" p:username="name01" p:password="123456"></bean>  | 
在bean标签中如上配置,便可以使用命名空间对对象的属性进行初始化。
5.4 SpEL
Spring表达式。
- 对
<property>进行统一编程,所有内容都使用value。 
1  | <property name="" value="#{表达式}"></property>  | 
#{123}、#{‘name01’}:数字、字符串。
#{beanId}:另一个bean引用。
#{beanId.propName}:操作数据。
#{beanId.toString()}:执行方法。
#{T(类).字段|方法}:静态方法或字段。
5.3 集合注入
集合注入的方法是给<property>添加子标签。
- 数组:
<array> - List:
<list> - Map:
<map>,map存放k/v键值对,使用<entry key="" value="">描述。 - Properties:
<props><prop key=""></prop> 
5.4 注解注入
注解是一个类,可以在开发中取代xml配置文件。
@Component 取代<bean class="">。
@Component 取代<bean id="" class="">
@Repository(“名称”) :dao层。
@Service(“名称”):service层。
@Controller(“名称”):web层。
@Autowired:根据类型自动注入。
.png)
@Qualifier(“名称”):指定自动注入的id名称。
@Resource(name=”名称”)
@Scope(“prototype”):bean为多例。
@PostConstruct:自定义初始化。
@PreDestory:自定义销毁。
例:
在本应由xml配置的UserServiceImpl类前加@Component注解以代替在xml中的配置。
test.java
1  | 
  | 
beans.xml
1  | 
  |