文章目录
一.Spring使用步骤
以Maven项目为例
-
在pom.xml中导入Spring框架坐标1
-
在src中创建Bean类
-
在resoures中创建配置文件2
-
在配置文件中配置Bean的id以及对应的全类名
-
创建ApplicationContext对象,然后使用该对象的getBean(id)方法获得Spring容器中的对象
二.配置文件
首先说明,Spring是采用控制反转(IOC)的设计思想,这意味着你设计好的对象将交给IOC容器来控制,而不是传统的在你的对象内部直接控制(创建、销毁)。
1.Bean标签配置scope属性
Bean标签可以配置scope属性,若不指定,默认值为singleton,即单例模式。还可以指定为propotype等,下面展示不同取值的区别。
1.1 singleton:
-
Bean的实例化个数:1个
-
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例 。往后每次用getBean()获取的对象都是同一个。
所以即使不getBean(),只要运行时有加载到配置文件,就会输出UserDao对象创建了
-
Bean的生命周期:
- 对象创建:当应用加载,创建容器时,对象就被创建了
- 对象运行:只要容器在,对象一直活着
- 对象销毁:当应用卸载,销毁容器时,对象就被销毁了
下面是实例化测试
applicationContext.xml配置文件
<?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 id="UserDao" class="guide.Impl.UserDaoImpl"></bean><!-- 配置bean的id对应的全类名,scope值默认singleton-->
</beans>
//UserDaoImpl类,包含了构造方法与run方法
class UserDaoImpl implements UserDao {
public UserDaoImpl(){
System.out.println("UserDao对象创建了");
}
public void run() {
System.out.println("UserDao的run方法执行了");
}
}
public class TestExample {
@Test
public void test(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) applicationContext.getBean("UserDao");//直接通过beanid获取对象
UserDao userDao2 = (UserDao) applicationContext.getBean("UserDao");
System.out.println(userDao1 == userDao2);
}
}
输出结果
UserDao对象创建了
true
可以看到构造方法只执行了一次,且两个对象的地址值相同
1.2 prototype:
- 实例化个数:多个
- Bean的实例化时机:当调用getBean()方法时实例化Bean,每调用getBean一次,堆中就多一个对象
- Bean的生命周期
- 对象创建:当使用对象时,创建新的对象实例
- 对象运行:只要对象在使用中,就一直活着
- 对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收
java代码依旧是上面的,当我们把配置文件中bean的scope指定为prototype之后,输出结果如下
UserDao对象创建了
UserDao对象创建了
false
可以看到构造方法执行了两次,而且两个对象的地址值是不同的。
2.Bean标签的其他属性配置
还可以给Bean标签配置init-method,和destroy-method属性,指定对象初始化与销毁时调用的方法
3.Bean对象实例化的三种模式
-
无参构造方法实例化
-
工厂静态方法实例化
-
工厂实例方法实例化
我们主要使用的是无参构造方法实例化
4.依赖注入(DI)
首先什么是依赖?
当我们实例化对象时,它里面可能需要调用到其他对象。举个例子,对象1里面需要调用到对象2,那么就表明对象1依赖对象2,依赖注入就是对象1需要的对象2是来自于Spring容器中的。所以在这之前,对象1与对象2的bean都必须配置到applicationContext.xml文件中。
简单来说,就是通过框架把持久层对象注入业务层。
依赖注入,是Spring框架的核心IOC的实现
通过依赖注入,我们只需要通过简单的配置,而无需任何代码就可以指定目标所需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
说白了,就是面向配置编程。
接下来就在配置文件中进行依赖注入。想一想,我们平时给对象传值的时候,可以通过构造方法和set方法,注入也是基于这两种方法实现的
- set方法注入
- 构造方法注入
注入的数据类型可以是以下几种,以set注入为例:
4.1 引用对象
注入的对象以及被注入的对象都需要存在于IOC容器中
<!--配置userService的全类名,以及注入userDao-->
<bean id="userService" class="guide.Service.Impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
4.2 基本数据类型
<!--配置两个user对象,以及注入基本类型数据。另外,user对象作为map集合的value-->
<bean id="user1" class="guide.Domain.User">
<property name="name" value="john"></property>
<property name="age" value="18"></property>
</bean>
<bean id="user2" class="guide.Domain.User">
<property name="name" value="john"></property>
<property name="age" value="18"></property>
</bean>
注:这里字符串可当成基本类型进行注入
4.3 集合
<!--注入userDao的集合元素-->
<bean id="userDao" class="guide.Dao.Impl.UserDaoImpl">
<!--配置list集合-->
<property name="strlist">
<list>
<value>迪丽热巴</value>
<value>古力娜扎</value>
<value>马儿扎哈</value>
</list>
</property>
<!--配置map集合-->
<property name="userMap">
<map>
<entry key="1" value-ref="user1"></entry>
<entry key="2" value-ref="user2"></entry>
</map>
</property>
<!--配置properties集合-->
<property name="strPro">
<props>
<prop key="p1">李时珍</prop>
<prop key="p2">白求恩</prop>
<prop key="p3">华佗</prop>
</props>
</property>
</bean>
5.重点配置
<bean>标签:id与类的映射
id属性:在容器中Bean实例的唯一标识,不允许重复
class属性:要实例化的Bean的全限定名
scope属性:Bean的作用范围,常用是Singleton(默认)和prototype
<property>标签:属性注入
name属性:属性名称
value属性:注入的普通属性值
ref属性:注入的对象引用值,即bean的id
<list>标签:list集合
<map>标签:map集合用
<properties>标签:properties集合用
<constructor-arg>标签:用于构造方法方式进行注入
<import>标签:导入其他的Springxml分文件
三.Spring相关API
1. ApplicationContext的实现类
1)ClassPathXmlApplicationContext 它是从类的根路径下加载配置文件 推荐使用这种
2)FileSystemXmlApplicationContext 它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
3)AnnotationConfigApplicationContext 当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
2.getBean()方法的使用以及重载形式
-
getBean(String name):通过id获取对象,返回是Object,需要强转为指定类型
-
getBean(Class requiredType) :根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则不能用此方法。返回的是class类对应类型,无需强转。