1.Spring是什么
简单来说,spring是一个IOC(DI)和AOP容器框架
- IOC(Inversion of Control):即控制反转,反转资源获取的方向,容器主动地将资源推送给它所管理的组件。
- DI(Dependency Injection):即依赖注入,IOC的另一种表述方式,组件以一些预先定义好的方式接受来自如容器的注入。
2.在Spring的IOC容器里配置Bean(这里先讲基于xml文件的方式)
- Bean的配置方式
- 通过全类名(反射),所以要求Bean 中必须有无参构造器
- 通过工厂方法(静态工厂方法 & 实例工厂方法)
- FactoryBean
- 在xml文件中通过节点来配置bean
<!--通过全类名的方式来配置bean-->
<bean id="example" class="com.itzzz.spring.example">
</bean>
- id: Bean的名称
- 在IOC容器中唯一;
- 若id没有指定,spring自动将全限定性类名作为Bean的名字;
- id可以指定多个名字,名字之间可用逗号、分号、或空格分隔。
Spring容器
在spring IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化。
- Spring提供了两种类型的IOC容器实现:
- BeanFactory:IOC容器的基本实现(很少使用);
- ApplicationContext:提供了更多的高级特性,是BeanFactory的子接口。
- ApplicationContext的主要实现类
- ClassPathXmlApplicationContext:从类路径下加载配置文件
- FileSystemXmlApplicationContext:从文件系统中加载配置文件
- ConfigurationApplicationContext扩展于ApplicationContext,新增两个主要方法:refresh() 和 close(),让ApplicationContext具有启动、刷新和关闭上下文的的能力
- ApplicationContext在初始化上下文时就能实例化所有单例的Bean.
- WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作
从IOC容器种获取Bean
- 调用 ApplicationContext 的 getBean() 方法
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) ctx.getBean("user");
- bean之间的关系
依赖:可以用ref 属性值指定当前属性指向哪一个 bean
继承:使用parent属性实现 - 自动装配:只声明 bean, 而把 bean 之间的关系交给 IOC 容器来完成,
- byType: 根据类型进行自动装配. 但要求 IOC 容器中只有一个类型对应的 bean, 若有多个则无法完成自动装配.
- byName: 若属性名和某一个 bean 的 id 名一致, 即可完成自动装配. 若没有 id 一致的, 则无法完成自动装配
在使用 XML 配置时, 自动转配用的不多. 但在基于 注解 的配置时, 自动装配使用的较多。
使用 list 元素来装配集合属性
<!--users为Bean的集合类型-->
<property name="users">
<list>
<ref bean="user1"/>
<ref bean="user2"/>
</list>
</property>
- SpEL:
SpEL: #{ },类似EL表达式,EL表达式: ${ }
SpEL的使用:
1.通过bean的id对bean进行引用
2.调用方法以及引用对象中的属性
3.计算表达式的值
4.正则表达式的匹配
引用的方法:
1.reference
2.SpEL
具体使用
1.使用spel引用类的静态属性: value="#{T(java.lang.Math).PI*80}"
2.使用spel来应用其他的bean: value="#{user}"
3.使用spel来应用其他的bean的属性: value="#{user.username}"
4.在spel中使用运算符: value="#{car.price>30? 1: 0}"
- 内部Bean
类似于匿名内部类对象. 不能被外部的 bean 来引用, 也没有必要设置 id 属性
<bean id="user" class="com.itzzz.spring.User">
<property name="zzz" ref="user2"></property>
</bean>
- 导入外部的资源文件:需要用context:property-placeholder标签,在location属性中指明路径
依赖注入的方式
- 属性注入
属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象,属性注入使用 property元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 子节点指定属性值
属性注入是实际应用中最常用的注入方式
<bean id="user" class="com.itzzz.spring.User">
<property name="username" value="zzz"></property>
</bean>
这里的name属性值对应setter方法名
- 构造器注入
通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。构造器注入在 constructor-arg 元素里声明属性, constructor-arg 中没有 name 属性
<bean id="user" class="com.itzzz.spring.User">
<!--按索引匹配,以区分重载构造器-->
<constructor-arg value="zzz" index=0></constructor>
<!--或按类型匹配-->
<constructor-arg value="zzz" typt="java.lang.String"/>
</bean>
若字面值中包含特殊字符, 则可以使用 CDATA 来进行赋值
<constructor-arg value="<![CDATA[<ATARZA>]]"></constructor-arg>
若想为属性赋null值,可以使用专门的标签
<bean id="user" class="com.atguigu.spring.User">
<property name="username"><null/></property>
</bean>
- 工厂方法注入(很少使用,不推荐)