一、Spring IoC 容器的启动
想要学习 Spring IoC
一定是需要先知道怎么把 Spring
容器启动起来。根据开发环境的不同,Spring IoC
容器的启动方式也不同。
JavaSE
环境下容器的启动方式有三种,分别为:
ClassPathXmlApplicationContext:从 classpath(类的根路径)下加载配置⽂件(推荐使⽤)
FileSystemXmlApplicationContext:从磁盘绝对路径上加载配置⽂件(不推荐)
AnnotationConfigApplicationContext:纯注解模式下启动 Spring 容器
Java Web
环境下容器的启动方式有两种,分别为:
- 新纯注解模式下,
web.xml
通过加载Spring
配置文件进行启动
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>spring-ioc-aop-xml</display-name>
<!--设置 Spring IoC 配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--添加 Spring web 容器启动监听-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
- 纯注解模式下,
webxml
通过加载Spring
配置类进行启动
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>spring-ioc-aop-xml</display-name>
<!--设置 ContextloaderListener 为通过配置类的方式启动 Spring-->
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<!--设置 Spring IoC 配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.idol.Config</param-value>
</context-param>
<!--添加 Spring web 容器启动监听-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
二、纯 xml 文件方式配置 Spring
通过纯 xml
配置文件实例化 Bean
的方式有三种:
- 通过构造函数实例化。该过程,可通过无参、有参构造函数实例化对象,同时可对属性的赋值。需要注意的是:如果多个对象都通过有参构造函数实例化对象,且彼此依赖。这种循环依赖问题的出现会导致对象初始化失败。
- 通过静态方法实例化。
- 通过实例化方法实例化。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- ↓↓↓↓ Bean 的实例化方式(一):通过构造函数实例化 ↓↓↓↓ -->
<bean id="employeeDao" class="com.idol.dao.impl.EmployeeDao"></bean>
<bean id="employee" class="com.idol.pojo.Employee">
<!--为属性设置默认值。 注意:通过 xml 为属性赋值时,被赋值的属性必须有 set 方法-->
<property name="name" value="Tom"/>
</bean>
<bean id="company" class="com.idol.pojo.Company">
<!--当属性的类型为对象引用时,我们可以使用 ref 属性,来为对象赋值-->
<property name="boss" ref="employee"/>
</bean>
<!--实例化非空构造函数对象。 注意:实例化多个非空构造函数对象时,如果产生循环引用,则会倒导致系统错误!-->
<bean id="employeeService" class="com.idol.service.impl.EmployeeService">
<!--为构造函数中的对象引用赋值-->
<constructor-arg name="employeeDao" ref="employeeDao"/>
</bean>
<!-- 多参数构造函数实例化对象 -->
<bean id="constructorParameterBean" class="com.idol.pojo.ConstructorParameterBean">
<!--通过参数索引赋值-->
<constructor-arg index="0" value="有惨构造测试"/>
<!--通过参数名赋值-->
<constructor-arg name="myArray">
<!--为数组类型赋值-->
<array>
<value>嘿嘿嘿</value>
<value>哈哈哈</value>
<value>嘻嘻嘻</value>
</array>
</constructor-arg>
<!--为 List 赋值-->
<property name="myList">
<list>
<value>唧唧唧</value>
<value>嘎嘎嘎</value>
</list>
</property>
<!--为 Map 添加引用类型的值-->
<property name="myMap">
<map>
<entry key="employee" value-ref="employee"></entry>
<entry key="company" value-ref="company"></entry>
</map>
</property>
<!--为 Set 类型赋值-->
<property name="mySet">
<set>
<value>aaa</value>
<value>bbb</value>
</set>
</property>
<!--为 Properties 类型赋值-->
<property name="myProperties">
<props>
<prop key="ccc">ccc</prop>
<prop key="ddd">ddd</prop>
</props>
</property>
</bean>
<!-- ↓↓↓↓ Bean 的实例化方式(二):通过静态方法实例化 ↓↓↓↓ -->
<bean id="staticMethodInitObject" class="com.idol.pojo.StaticMethodInitObject" factory-method="getInstance"></bean>
<!-- ↓↓↓↓ Bean 的实例化方式(三):通过实例化方法获取 Bean ↓↓↓↓ -->
<bean id="employeeBeanFactory" class="com.idol.pojo.EmployeeBeanFactory"></bean>
<bean id="createdByFactroyEmployee" factory-bean="employeeBeanFactory" factory-method="createEmployeeBean"/>
<!-- ↓↓↓↓ Bean 声明周期配置(默认 scope 为单例模式) ↓↓↓↓ -->
<bean id="prototypeScopeBean" class="com.idol.pojo.PrototypeScopeBean" scope="prototype"/>
<!-- ↓↓↓↓ Spring 初始化与销毁 Bean 回调 ↓↓↓↓ -->
<bean id="initMethodAndDestoryMethodBean" class="com.idol.pojo.InitMethodAndDestoryMethodBean" init-method="initCallBack" destroy-method="destoryCallBack"/>
</beans>
三、xml 与 注解相结合配置 Spring
xml
与注解相结合的方式是企业级开发中经常会用到的方式。我们通常将来自第三方的对象通过xml
的方式进行加载。而自定义的对象则通过注解的方式就行加载。- 为了能添加了注解的定义的类进行加载,需要在
Spring
配置文件中开启包扫描。 AOP
和声明式事务的相关内容通常也会被添加在Spring
配置文件中。
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
">
<!--开启注解扫描,base-package指定扫描的包路径-->
<context:component-scan base-package="com.idol"/>
<!--引入外部资源文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--第三方jar中的bean定义在xml中-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
</beans>
四、纯注解方式配置 Spring
随着 Spring Boot
的流行,纯注解的开发方式也变的更加流行。具体的注解用法就不做赘述,说一下需要注意的点:
- 如果同一个接口下存在多个实现类,则必须在实现类的注解中为该类设置别名。且在通过
@Autowired
注入该对象时,配合@Qualifier("employeeDao1")
注解使用。 - 通过
@Bean
注解加载进Spring
容器中的对象,如果想通过对象类名首字母小写的方式从ApplicationContext
中获取对象,则必须在注解中为该类设置别名。 - 如果有多个
@Configuration
配置类,则可通过@Import
注解汇集到一个配置对象中。
源码
------------------------- 靡不有初 鲜克有终 -------------------------