目录:IOC
AOP
JDBC
事务管理
一、IOC
1.IOC(Inversion Of Control):反转资源获取的方向。传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源。应用IOC后,则是容器主动地将资源推送给它所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源。这种方式也被称为查找的被动形式。
2.DI(Dependency Injection)---IOC的另一种表达方式:组件以一些预先定义好的方式(如:setter方法)接受来自容器的资源注入。
3.在Spring的IOC容器中配置Bean
<!-- 配置bean-->
<bean id="helloWorld" class="test1.HelloWorld">
<property name="name" value="Spring"></property>
</bean>
class:bean的全类名:通过反射的方式在IoC容器中创建Bean所以要求Bean中必须有无参的构造器
id:bean的名称:(1)在IoC容器中必须是唯一的。
(2)若id没有指定,Spring自动将全类名作为Bean的名字
(3)id可以指定多个名字,名字之间用逗号,分号,或空格分隔
4.Spring容器
在SpringIOC容器读取Bean配置创建Bean实例之前,必须对它实例化。只有在容器实例化后,才可以从IOC容器里获取Bean实例并使用。
Spring提供了两种类型的IOC容器实现
(1)BeanFactory IOC 容器的基本实现
(2) ApplicationContext 提供了更多的高级特性,是BeanFactoryde 子接口
BeanFactory是Spring框架的基础设施,面向Spring本身
ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都直接使用ApplicationContext而非底层的BeanFactory
无论使用何种方式,配置文件时相同的
5.ApplicationContext
主要实现类:
(1)ClassPathXmlApplicationContext:从类路径下加载配置文件
(2)FileSystemXmlApplicationContext:从系统中加载配置文件
ConfigurableApplicationContext扩展于ApplicationContext,新增加两个方法:
refresh()和close(),让ApplicationContext具有启动、刷新和关闭上下文的能力
ApplicationContext在初始化上下文时就实例化所有单例的Bean。
WebApplicationContext是专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作。
6.从IoC容器中获取Bean
调用ApplicationContext中的getBean()方法
7.依赖注入的方式
(1)属性注入
属性注入即通过setter方法注入Bean的属性值或对象
属性注入使用<proprety>元素,使用name属性指定bean的属性名称,value属性或<value>子节点指定属性值
属性注入是实际应用中最常用的注入方式
<property name="userName" value="zy"></property>
(2)构造器注入
通过构造方法注入Bean的属性值或依赖的对象,它保证了Bean实例在实例化后就可以使用
1)按索引匹配入参
<bean id="car" class="test1.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg value="Shanghai" index="1"></constructor-arg>
<constructor-arg value="30000" index="2"></constructor-arg>
</bean>
2)按类型匹配入参
<bean id="car" class="test1.Car">
<constructor-arg value="Audi" type="java.lang.String"></constructor-arg>
<constructor-arg value="Shanghai"type="java.lang.String"></constructor-arg>
<constructor-arg value="30000" type="int"></constructor-arg>
</bean>
(3)工厂方法注入(少用,不推荐)
8.注入属性的细节
字面值:可用字符串表示的值,可以通过<value>元素标签或value属性进行注入
基本数据类型及其封装类、String等类型都可以才去字面值注入的方式
若字面值中包含特殊字符,可以使用<![CDATA[字符串]]>把字面值包裹起来
<constructor-arg type="java.lang.String">
<value><![CDATA[<Shanghai^>]]></value>
</constructor-arg>
9.引入其他的Bean
组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 要使 Bean 能够相互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用
在 Bean 的配置文件中, 可以通过 <ref> 元素或 ref 属性为 Bean 的属性或构造器参数指定对 Bean 的引用.
<bean id=car2 class="test1.Car">
<property name="car2" ref="car">
</bean>
也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean
内部bean: 当 Bean 实例仅仅给一个特定的属性使用时, 可以将其声明为内部 Bean. 内部 Bean 声明直接包含在 <property> 或 <constructor-arg> 元素里, 不需要设置任何 id 或 name 属性.内部 Bean 不能使用在任何其他地方
10.为级联属性赋值
<property name=”car.maxSpeed” value=”250”><property/>
11.注入null值。使用<null/>元素标签为Bean的字符串或其他对象类型的属性注入null。
12.
13.
20.基于注解的方式(基于注解配置Bean)
组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解组件
特定组件包括:
Component:基本注解,标识了一个受Spring管理的组件
Respository:标识了持久层(DAO实现类)组件
Service:标识服务层(业务层)组件
Controller:标识表现层组件
对于扫描到的组件,Spring有默认的命名策略:使用非限定类别,第一个字母小写。也可以在注解中通过value属性值标识组件的名称。
当在组件类上使用了特定的注解之后,还需要在Spring的配置文件中声明<context:component-scan>
base-package属性指定一个需要扫面的基类包,Spring容器将会扫描这个基类包里及其子包中的所有类
当需要扫描多个包时,可以使用逗号分隔
如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类
<context:include-filter> 子节点表示要包含的目标类
<context:exclude-filter> 子节点表示要排除在外的目标类
<context:component-scan>下可以拥有若干个<context:include-filter>和<context:exclude-filter>子节点
组件装配:<context:component-scan>元素还会自动注册AutowiredAnnotationBeanPostProcessor实例,该实例可以自动装配具有@Autowired和@Resource和@Inject注解的属性
@Autowired注解自动装配具有兼容类型的单个Bean属性
构造器,普通字段(即使是非public),一切具有参数的方法都可以应用@Autowired注解
默认情况下,所有使用@Autowired注解的属性都需要被设置。当Spring找不到匹配的Bean装配属性时,会抛出异常。若允许一个属性不被设置,可以做以下设置
@Autowired(required=false)
默认情况下,当IoC容器里存在多个类型兼容的Bean时,通过类型的自动装配将无法工作,此时可以在@Qualifier注解里提供Bean的名称,Spring允许对方法的入参标注@Qualifier 以指定注入Bean的名称
@Autowired
@Qualifier("userService")
@Autowired 注解也可以应用在数组类型的属性上, 此时 Spring 将会把所有匹配的 Bean 进行自动装配.
@Autowired 注解也可以应用在集合属性上, 此时 Spring 读取该集合的类型信息, 然后自动装配所有与之兼容的 Bean.
@Autowired 注解用在 java.util.Map 上时, 若该 Map 的键值为 String, 那么 Spring 将自动装配与之 Map 值类型兼容的 Bean, 此时 Bean 的名称作为键值