Spring快速入门、配置文件详解、依赖注入DI、相关api

一.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类对应类型,无需强转。


  1. spring-context ↩︎

  2. 名字随意,一般叫applicationContext.xml ↩︎

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值