什么是spring,它能够做什么?
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB(EJB 是为了"服务集群"和"企业级开发")完成的事情。
然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
1、 IOC/DI
将以前由程序员实例化对象/赋值的工作交给了spring处理
什么是控制反转(IoC):
谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建以及外部资源获取(不只是对象包括比如文件等)。
可以理解为控制权由应用代码移交给外部容器(spring)
为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;
而反转则是由容器来帮忙创建及注入依赖对象(DI——Dependency Injection,是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处)
理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”
由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转,依赖对象的获取被反转了。
2、如何使用Spring
在resources目录右键 New -> Spring -> Spring Bean Configuration File
配置web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> </web-app>
在pox.xml中进行jar包装载
<!--在properties中配置-->
<properties>
<spring.version>5.0.1.RELEASE</spring.version>
<properties>
<!--在<dependencies>中配置-->
<dependencies>
<!--spring-context-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring-core-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
3、如何配置Bean
创建一个spring.xml里面配置Bean
<!--bean就是java对象,由Spring创建和管理-->
<!-- id 是bean的标识符,要唯一,如果没有配置id,name就是默认标识符 如果配置id,又配置了name,那么name是别名 name可以设置多个别名,可以用逗号,分号,空格隔开 如果不配置id和name,可以根据applicationContext.getBean(.class)获取对象; class是bean的全限定名=包名+类名 -->
<!--scope:(singleton|prototype)默认是singleton-->
<!--init-method:指定bean的初始化方法-->
<bean id="hello" name="a b c" class="com.zking.spring.entity.Hello" scope="prototype" init-method="init" >
<property name="name">
id:在容器中查找Bean的id(唯一、且不能以/开头)
class:bean的完整类名
name:在容器中查找Bean的名字(唯一、允许以/开头、允许多个值,多个值之间用逗号或空格 隔 开)
scope:(singleton|prototype)默认是singleton
singleton(单例模式):在每个Spring IoC容器中一个bean定义对应一个对象实例
prototype(原型模式/多例模式):一个bean定义对应多个对象实例
abstract:将一个bean定义成抽象bean(抽象bean是不能实例化的),抽象类一定要定义成抽象 bean, 非抽象类也可以定义成抽象bean
<bean id="person" class="com.zking.spring.entity.Person" abstract="true">
<property name="name" >
<value>佚名</value>
</property>
</bean>
parent:指定一个父bean(必须要有继承关系才行)
<bean id="student" class="com.zking.spring.entity.Student">
<property name="sid">
<value>1</value>
</property>
<property name="name">
<value>张三</value>
</property>
<property name="score">
<value>100</value>
</property>
<property name="birthday">
<bean factory-bean="dateFormat" factory-method="parse">
<constructor-arg value="2018-02-01">
</constructor-arg>
</bean>
init-method:指定bean的初始化方法
</property>
<property name="address">
<ref bean="address"></ref>
</property>
constructor-arg:使用有参数构造方法创建javaBean
<bean id="hello1" class="com.zking.spring.entity.Hello" >
<!--index=“0”中的0代表下标 0是第一个下标-->
<constructor-arg index="0">
<value>王武</value>
</constructor-arg>
</bean>
日期格式注入
<property name="birthday">
<bean factory-bean="dateFormat" factory-method="parse">
<constructor-arg value="2018-02-01">
</constructor-arg>
</bean>
</property>
在Student中要有此日期类型的属性
Student student = ac.getBean("student", Student.class);
System.out.println(student.getBirthday().toLocaleString());
配置读取文件的读取方式
//读取单个文件
// ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");//读取多个文件
// ApplicationContext ac=new ClassPathXmlApplicationContext(new String[]{"spring.xml","spring-address.xml"});//通配方式
<!--"spring-*.xml 中的*号必须有前缀不能只是*.xml-->
// ApplicationContext ac=new ClassPathXmlApplicationContext("spring-*.xml");