1.Spring
(1)Spring是什么?
是一个轻量级的、用来简化企业级应用开发的开发框架。
注: a.简化开发: Spring对常用的api做了简化,比如,使用Spring jdbc来访问数据库,就不用再考虑如何获取连接、关闭连接、处理异常等等。 b.解耦: Spring容器(Spring框架的一个模块)帮我们管理 对象(包括对象的创建及对象之间的依赖关系), 这样一来,对象之间的耦合度会大大降低,提供高了 系统的维护性。 c.集成其它框架: Spring可以将其它一些常用的框架集成进来,比如 可以将Quartz,MyBatis等集成进来。
(2)Spring容器
1)Spring容器是什么?
Spring框架的一个核心模块,用于管理对象。
注: 管理对象指的是,spring容器会用我们创建对象, 并且建立对象之间的依赖关系。
2)如何启动Spring容器?
step1.导包。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.8.RELEASE</version> </dependency>
step2.添加配置文件(applicationContext.xml)。
将配置文件添加到main/resources下。
step3.启动Spring容器。
ApplicationContext ac = new ClassPathXmlApplicationContext( "applicationContext.xml");
3)创建对象
a.方式一 使用无参构造器
step1. 给类添加无参构造器(缺省构造器)。 step2. 在配置文件当中,使用bean元素来进行配置。 <!-- 使用无参构造器来创建对象。 id属性要求唯一。 class属性指定类名(要写完整的类名)。 注: 在spring框架当中,将Spring容器所管理 的对象称之为一个bean。 --> <bean id="ap1" class="first.Apple"/> step3. 启动容器,调用容器提供的getBean方法。 //通过容器获得对象 Apple ap1 = ac.getBean("ap1",Apple.class);
b.方式二 使用静态工厂方法 (了解)
<!-- 使用静态工厂方法来创建对象。 factory-method属性用于指定一个静态 方法(static修饰的方法)。 注: 容器会调用指定类的静态方法来创建 对象。 --> <bean id="cal1" class="java.util.Calendar" factory-method="getInstance"/>
c.方式三 使用实例工厂方法 (了解)
<!-- 使用实例工厂方法来创建对象。 factory-bean属性指定bean的id, factory-method属性指定一个方法。 注: 容器会调用该bean的方法来创建一个 对象。 --> <bean id="date2" factory-bean="cal1" factory-method="getTime"/>
4)作用域
a.默认情况下,对于某个bean,容器只会创建一个实例。
b.如果要让容器创建多个实例,需要设置bean的作用域。
<!-- scope属性用于指定作用域, 缺省值是singleton,如果将值设置 为prototype,则容器会创建多个实例。 --> <bean id="eb1" class="basic.ExampleBean" scope="prototype"/>
5)生命周期
spring容器在创建好对象之后,会调用初始化方法, 在销毁该对象之前,会调用销毁方法。
<!-- init-method属性: 指定初始化方法 destroy-method属性:指定销毁方法。 注: 销毁方法只有当作用域为singleton 才有效。 --> <bean id="mb1" class="basic.MessageBean" init-method="init" destroy-method="destroy" scope="singleton"/>
6)延迟加载
a.默认情况下,容器启动之后,会将所有作用域为singleton的bean实例化。
b.延迟加载指的是,通过设置lazy-init="true"告诉容器, 启动之后不再创建其实例。
<!-- lazy-init属性如果值为true,表示 延迟加载。 --> <bean id="lb1" class="basic.LazyBean" lazy-init="true"/>
(3)IOC和DI
1)IOC是什么? (Inversion Of Controll 控制反转)
对象之间的依赖关系应该由容器来建立。
2)DI是什么? (Dependency Injection 依赖注入)
容器通过调用set方法或者构造器来建立对象之间的依赖关系。
注: IOC是目标,DI是手段。
3)set方法注入
step1. 为类添加set方法。
step2. 在配置文件当中,使用property元素来配置set 方法注入。
<!-- property元素表示采用set方法注入。 name属性用于指定set方法名 (容器会将b大写,前面添加set来 构造方法名)。 ref属性用于指定被注入的bean的id。 --> <bean id="a1" class="ioc.A"> <property name="b" ref="b1"/> </bean>
step3. 启动容器,调用getBean方法。
3)set方法注入
4)构造器注入
step1. 添加相应的带参的构造器。
step2. 使用<constructor-arg>元素来配置构造器注入。
<bean id="cpu" class="ioc.Cpu"/> <!-- constructor-arg元素用来配置构造器 注入。 index属性用于指定参数的下标。 ref属性用于指定被注入的bean的id。 --> <bean id="cp" class="ioc.Computer"> <constructor-arg index="0" ref="cpu"/> </bean>
step3. 启动容器,调用getBean方法。
4)自动装配 (了解)
a.什么是自动装配?
容器依据某些规则,自动查找符合要求的对象, 然后建立对象之间的依赖关系。 注: 容器仍然要调用set方法或者构造器。
b.如何自动装配?
使用autowire属性指定装配的规则: <bean id="wt1" class="autowire.Waiter"/> <!-- autowire属性表示让容器自动建立 对象之间的依赖关系,有三个值: byName: 以属性名作为bean的id,查找 对应的bean,然后调用set方法。 注:如果找不到对应的bean, 不会调用set方法。 byType: 以属性类型作为bean的类型,查找 对应的bean,然后调用set方法。 注: 如果找不到对应的bean, 不会调用set方法。 如果找到多个bean,会出错。 constructor: 类似于byType,只不过是调用构造器来 完成 注入。 --> <bean id="rest" class="autowire.Restaurant" autowire="byType"/>
5)注入基本类型的值
<bean id="vb" class="value.ValueBean"> <property name="name" value="小包总"/> <property name="age" value="20"/> </bean>
6)注入集合类型的值
a.支持四种集合类型的值的注入,分别是List,Set,Properties,Map。
b.注入方式如下:
<property name="interest"> <list> <value>打猎</value> <value>看书</value> <value>编程</value> <value>编程</value> </list> </property> <property name="city"> <set> <value>洛阳</value> <value>金陵</value> <value>开封</value> </set> </property> <property name="score"> <map> <entry key="english" value="59.5"/> <entry key="math" value="17"/> </map> </property> <property name="db"> <props> <prop key="username">tom</prop> <prop key="pwd">1234</prop> </props> </property>
7)引用的方式注入集合类型的值
<!-- 将集合类型的值配置成一个bean --> <util:list id="interestBean"> <value>打猎</value> <value>看书</value> <value>编程</value> </util:list> <util:set id="cityBean"> <value>北京</value> <value>南京</value> <value>东京</value> </util:set> <util:map id="scoreBean"> <entry key="english" value="80"/> <entry key="math" value="90"/> </util:map> <util:properties id="dbBean"> <prop key="username">John</prop> <prop key="pwd">1234</prop> </util:properties> <bean id="vb2" class="value.ValueBean"> <property name="interest" ref="interestBean"/> <property name="city" ref="cityBean"/> <property name="score" ref="scoreBean"/> <property name="db" ref="dbBean"/> </bean>
8)读取properties文件的内容
<!-- 读取properties文件的内容。 location属性用于指定要读取的文件的位置。 注: classpath:表示依据类路径去查找相应的 文件。 --> <util:properties id="config" location="classpath:config.properties"/>
9)spring表达式
a.spring表达式的作用?
可以用来读取其它bean的属性
b.用法如下图:
来源:https://www.cnblogs.com/ahaijava/p/10064264.html